Provided by: manpages-pl_4.13-4_all 

NAZWA
ip - Implementacja protokołu IPv4 dla systemu Linux
SKŁADNIA
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* nadzbiór poprzedniego */
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protokół);
OPIS
Linux implementuje protokół IPv4 opisany w RFC 791 i RFC 1122. ip zawiera drugi poziom implementacji
adresowania grupowego (multicasting) zgodny z RFC 1112. Zawiera też router IP, włączając w to filtr
pakietów.
Interfejs programistyczny jest zgodny z gniazdami BSD. Więcej informacji na temat gniazd można znaleźć,
przeglądając socket(7).
Gniazdo IP jest tworzone za pomocą socket(2):
socket(AF_INET, typ_gniazda, protokół);
Valid socket types include SOCK_STREAM to open a stream socket, SOCK_DGRAM to open a datagram socket, and
SOCK_RAW to open a raw(7) socket to access the IP protocol directly.
protocol is the IP protocol in the IP header to be received or sent. Valid values for protocol include:
• 0 and IPPROTO_TCP for tcp(7) stream sockets;
• 0 and IPPROTO_UDP for udp(7) datagram sockets;
• IPPROTO_SCTP for sctp(7) stream sockets; and
• IPPROTO_UDPLITE for udplite(7) datagram sockets.
For SOCK_RAW you may specify a valid IANA IP protocol defined in RFC 1700 assigned numbers.
Kiedy proces chce odbierać nowe, nadchodzące pakiety lub połączenia, powinien podłączyć gniazdo do adresu
lokalnego interfejsu za pomocą funkcji bind(2). W takim przypadku do dowolnej lokalnej pary (adres, port)
można podłączyć tylko jedno gniazdo IP. Gdy w wywołaniu bind(2) podana jest wartość INADDR_ANY, to
gniazdo zostanie dowiązane do wszystkich lokalnych interfejsów sieciowych. Gdy do niedowiązanego gniazda
wywoływane jest listen(2), to gniazdo zostanie automatycznie dowiązane do losowo wybranego wolnego portu,
przy czym adres lokalny zostanie ustawiony na INADDR_ANY. Gdy dla niedowiązanego gniazda zostanie
wywołane connect(2), gniazdo to zostanie automatycznie dowiązane do losowo wybranego wolnego portu lub do
używalnego portu dzielonego, przy czym adres lokalny zostanie ustawiony na INADDR_ANY.
Przypisywanie (często w literaturze: "nazywanie") lokalnego gniazda TCP jest niemożliwe przez pewien
okres czasu po jego zamknięciu, chyba że zostanie dla tego gniazda ustawiony atrybut SO_REUSEADDR. Należy
używać tego atrybutu z rozwagą, gdyż czyni on TCP mniej niezawodnym.
Format adresu
Adres gniazda IP jest przedstawiony za pomocą kombinacji adresu interfejsu IP i 16-bitowego numeru portu.
Podstawowy protokół IP nie zawiera numerów portów, są one zaimplementowane w protokołach wyższej warstwy,
takich jak udp(7) i tcp(7). Dla gniazd surowych sin_port jest ustawione na protokół IP.
struct sockaddr_in {
sa_family_t sin_family; /* rodzina adresów: AF_INET */
in_port_t sin_port; /* port - sieciowa kolejność bajtów */
struct in_addr sin_addr; /* adres internetowy */
};
/* Adres internetowy */
struct in_addr {
uint32_t s_addr; /* adres - sieciowa kolejność bajtów */
};
sin_family is always set to AF_INET. This is required; in Linux 2.2 most networking functions return
EINVAL when this setting is missing. sin_port contains the port in network byte order. The port numbers
below 1024 are called privileged ports (or sometimes: reserved ports). Only a privileged process (on
Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network
namespace) may bind(2) to these sockets. Note that the raw IPv4 protocol as such has no concept of a
port, they are implemented only by higher protocols like tcp(7) and udp(7).
sin_addr is the IP host address. The s_addr member of struct in_addr contains the host interface address
in network byte order. in_addr should be assigned one of the INADDR_* values (e.g., INADDR_LOOPBACK)
using htonl(3) or set using the inet_aton(3), inet_addr(3), inet_makeaddr(3) library functions or
directly with the name resolver (see gethostbyname(3)).
IPv4 addresses are divided into unicast, broadcast, and multicast addresses. Unicast addresses specify a
single interface of a host, broadcast addresses specify all hosts on a network, and multicast addresses
address all hosts in a multicast group. Datagrams to broadcast addresses can be sent or received only
when the SO_BROADCAST socket flag is set. In the current implementation, connection-oriented sockets are
allowed to use only unicast addresses.
Należy zauważyć, że dla adresu i portu zawsze jest używana sieciowa kolejność bajtów. W szczególności
oznacza to, że trzeba używać funkcji htons(3) dla numeru przypisanego do portu. Wszystkie funkcje
standardowej biblioteki manipulujące adresem/portem automatycznie przekształcają podaną wartość na jej
sieciową reprezentację.
Istnieje kilka adresów specjalnych: INADDR_LOOPBACK (127.0.0.1) zawsze odnosi się do lokalnego hosta
poprzez urządzenie loopback; INADDR_ANY (0.0.0.0) oznacza przy dowiązywaniu dowolny adres;
INADDR_BROADCAST (255.255.255.255) oznacza dowolny komputer i ze względów historycznych zachowuje się
przy dowiązywaniu tak samo, jak INADDR_ANY.
Opcje gniazda
IP wspiera niektóre opcje specyficzne dla protokołu, które mogą być ustawione przy użyciu setsockopt(2) i
odczytane z pomocą getsockopt(2). Poziom opcji gniazda dla IP to IPPROTO_IP. Dla każdego ze znaczników
logicznych wartość całkowita zero oznacza fałsz, a każda inna - prawdę.
Gdy poda się nieprawidłową opcję gniazda, getsockopt(2) i setsockopt(2) zwrócą błąd ENOPROTOOPT.
IP_ADD_MEMBERSHIP (od Linuksa 1.2)
Przyłącza grupę adresów. Argumentem jest struktura ip_mreqn .
struct ip_mreqn {
struct in_addr imr_multiaddr; /* grupowy adres IP */
struct in_addr imr_address; /* adres IP interfejsu
lokalnego */
int imr_ifindex; /* indeks interfejsu */
};
imr_multiaddr zawiera adres grupy, którą aplikacja chce podłączyć lub rozłączyć. Musi być to poprawny
adres grupowy (multicast; w przeciwnym wypadku setsockopt(2) zwróci błąd EINVAL). imr_address jest to
adres lokalnego interfejsu, przez który system powinien połączyć grupę; jeśli jest równy INADDR_ANY, to
odpowiedni interfejs jest wybierany przez system. imr_ifindex jest indeksem interfejsu, który powinien
być podłączony/odłączony do obsługi grupy imr_multiaddr lub 0, by wskazać na dowolny interfejs.
Struktura ip_mreqn jest dostępna tylko od wersji 2.2 Linuksa. Dla kompatybilności, stara struktura
ip_mreq wciąż jest obsługiwana. Różni się wprawdzie od ip_mreqn, lecz tylko tym, że nie zawiera
pola imr_ifindex (jądro określa którą strukturę zastosowano na podstawie rozmiaru podanego w
optlen).
IP_ADD_MEMBERSHIP jest prawidłowe wyłącznie dla setsockopt(2).
IP_ADD_SOURCE_MEMBERSHIP (od Linuksa 2.4.22 / 2.5.68)
Przyłącza adres grupowy (multicast) i zezwala na otrzymywanie danych jedynie z podanego źródła.
Argumentem jest struktura ip_mreq_source.
struct ip_mreq_source {
struct in_addr imr_multiaddr; /* grupowy adres IP */
struct in_addr imr_interface; /* adres IP interfejsu
lokalnego */
struct in_addr imr_sourceaddr; /* adres IP
grupowego źródła */
};
The ip_mreq_source structure is similar to ip_mreqn described under IP_ADD_MEMBERSHIP. The imr_multiaddr
field contains the address of the multicast group the application wants to join or leave. The
imr_interface field is the address of the local interface with which the system should join the multicast
group. Finally, the imr_sourceaddr field contains the address of the source the application wants to
receive data from.
Opcja może być użyta kilkakrotnie aby otrzymywać dane z kilku źródeł.
IP_BIND_ADDRESS_NO_PORT (od Linuksa 4.2)
Informuje jądro, aby nie rezerwować portu efemerycznego przy korzystaniu z bind(2) z numerem portu
0. Port będzie wybrany automatycznie później, w trakcie wykonywania connect(2), w sposób
umożliwiający współdzielenie portu źródłowego tak długo, jak długo unikatowa jest czteroelementowa
krotka.
IP_BLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
Kończy otrzymywanie danych grupowych z podanego źródła i podanej grupy. Jest to odpowiednie
jedynie po zapisaniu się do adresu grupowego za pomocą IP_ADD_MEMBERSHIP lub
IP_ADD_SOURCE_MEMBERSHIP.
Argumentem jest struktura ip_mreq_source opisana w części dotyczącej IP_ADD_SOURCE_MEMBERSHIP.
IP_DROP_MEMBERSHIP (od Linuksa 1.2)
Odłącza się od grupy adresów. Argumentem jest struktura ip_mreqn lub ip_mreq podobna do
IP_ADD_MEMBERSHIP.
IP_DROP_SOURCE_MEMBERSHIP (od Linuksa 2.4.22 / 2.5.68)
Leave a source-specific group—that is, stop receiving data from a given multicast group that come
from a given source. If the application has subscribed to multiple sources within the same group,
data from the remaining sources will still be delivered. To stop receiving data from all sources
at once, use IP_DROP_MEMBERSHIP.
Argumentem jest struktura ip_mreq_source opisana w części dotyczącej IP_ADD_SOURCE_MEMBERSHIP.
IP_FREEBIND (od Linuksa 2.4)
Jeśli jest włączona, to ta opcja logiczna pozwala na przypisanie do adresu nielokalnego lub
(jeszcze) nieistniejącego. Pozwala to na nasłuchiwanie na gnieździe bez wymagania, żeby interfejs
sieciowy niższej warstwy lub podany dynamiczny adres IP były ustawione podczas próby przypisania
gniazda przez aplikację. Ta opcja jest odpowiednikiem - dla pojedynczego gniazda - opisanego
poniżej interfejsu /proc ip_nonlocal_bind.
IP_HDRINCL (od Linuksa 2.0)
Jeśli włączone, to dopuszczalne jest tworzenie przez użytkownika własnego nagłówka IP przed danymi
użytkownika. Działa to jedynie dla gniazd SOCK_RAW, patrz raw(7), by uzyskać więcej informacji.
Gdy ten znacznik jest włączony, to wartości ustawiane przez IP_OPTIONS, IP_TTL i IP_TOS są
ignorowane.
IP_MSFILTER (od Linuksa 2.4.22 / 2.5.68)
Opcja pozwala na uzyskanie dostępu do zaawansowanego interfejsu filtrowania pełnostanowego.
Argumentem jest struktura ip_msfilter.
struct ip_mreqn {
struct in_addr imsf_multiaddr; /* grupowy adres IP */
struct in_addr imsf_interface; /* adres IP interfejsu
lokalnego */
uint32_t imsf_fmode; /* tryb filtra */
};
uint32_t imsf_numsrc; /* Liczba źródeł w
kolejnej macierzy */
struct in_addr imsf_slist[1]; /* Macierz źródeł
adresów */
};
Do określenia trybu filtrowania służą dwa makra - MCAST_INCLUDE i MCAST_EXCLUDE. Makro
IP_MSFILTER_SIZE(n) służy natomiast do określenia wielkości pamięci potrzebnej do przechowania struktury
ip_msfilter z n źródeł w liście źródeł.
Pełny opis filtrowania źródeł adresów zawiera dokument RFC 3376.
IP_MTU (od Linuksa 2.2)
Pobiera bieżącą wartość MTU ścieżki obecnego gniazda. Zwraca liczbę całkowitą.
IP_MTU jest poprawne tylko do getsockopt(2) i można go użyć wyłącznie gdy gniazdo zostało
połączone.
IP_MTU_DISCOVER (od Linuksa 2.2)
Ustawia lub pobiera opcję badania MTU ścieżki (ang. Path MTU Discovery) dla gniazda. Gdy opcja ta
jest włączona, to Linux będzie przeprowadzał badanie MTU ścieżki dla gniazd SOCK_STREAM zgodnie z
definicją zawartą w RFC 1191. W przypadku gniazd nie będących gniazdami SOCK_STREAM,
IP_PMTUDISC_DO wymusza ustawienie we wszystkich pakietach wychodzących znacznika zakazu
fragmentacji. Za poprawne zgodne z wartością MTU, podzielenie na pakiety i za wykonanie
ewentualnych retransmisji jest odpowiedzialny program użytkownika. Jądro odrzuci (z błędem
EMSGSIZE) pakiety większe niż znane MTU ścieżki. Ustawienie znacznika IP_PMTUDISC_WANT spowoduje
sfragmentowanie datagramu, jeśli MTU ścieżki tego wymaga, albo - w przeciwnym wypadku - ustawienie
znacznika zakazującego fragmentacji.
Domyślną dla systemu wartość można ustawić na IP_PMTUDISC_WANT lub na IP_PMTUDISC_DONT, wpisując
odpowiednio - zero lub wartość niezerową - do pliku /proc/sys/net/ipv4/ip_no_pmtu_disc.
Wart. badan. MTU ścieżki Znaczenie
IP_PMTUDISC_WANT Używaj ustawień zależnych od trasy.
IP_PMTUDISC_DONT Nie badaj MTU ścieżki.
IP_PMTUDISC_DO Zawsze badaj MTU ścieżki.
IP_PMTUDISC_PROBE Ustawia bit DF, ale ignoruje MTU ścieżki.
Gdy włączone jest badanie MTU ścieżki, jądro automatycznie namierza wartości MTU ścieżki dla
każdego komputera docelowego. Gdy aktywne jest połączenie z danym komputerem, można wygodnie
odczytać aktualnie rozpoznaną wartość MTU ścieżki za pomocą connect(2) używając opcji gniazda
IP_MTU (np. po wystąpieniu błędu EMSGSIZE). Wartość MTU ścieżki może się zmieniać z czasem. Dla
gniazd bezpołączeniowych z wieloma komputerami docelowymi MTU dla danego, również nowego,
komputera docelowego można uzyskać za pomocą kolejki błędów (zobacz IP_RECVERR). Po nadejściu
każdej aktualizacji MTU zostanie skolejkowany nowy błąd.
W trakcie rozpoznawania MTU, pakiety inicjujące z gniazd datagramowych mogą zostać porzucone.
Programy korzystające z UDP powinny być tego świadome i nie brać tego pod uwagę w swojej strategii
retransmisji pakietów.
To bootstrap the path MTU discovery process on unconnected sockets, it is possible to start with a
big datagram size (headers up to 64 kilobytes long) and let it shrink by updates of the path MTU.
Aby oszacować inicjalne MTU ścieżki, należy podłączyć gniazdo datagramowe do adresu docelowego za
pomocą connect(2) i pobrać MTU, wołając getsockopt(2) z opcją IP_MTU.
Poprzez ustawienie wartości w IP_PMTUDISC_PROBE (dostępnej od Linuksa 2.6.22) możliwe jest
zaimplementowanie opisanego w RFC 4821 próbkowania MTU dla gniazd SOCK_DGRAM lub SOCK_RAW. Jest
to szczególnie użyteczne w narzędziach diagnostycznych typu tracepath(8), które w sposób
zamierzony chcą wysyłać pakiety testowe większe niż zaobserwowane MTU ścieżki.
IP_MULTICAST_ALL (od Linuksa 2.6.31)
Tej opcji można użyć do modyfikacji zasad dostarczania wiadomości grupowych do gniazd
ograniczonych maską adresu INADDR_ANY. Argument wynosi 0 lub 1 (domyślnie 1). Gdy jest ustawiony
na 1, to gniazdo otrzyma wiadomości ze wszystkich grup, które dołączono globalnie z całego
systemu. W przeciwnym razie dostarczone będą tylko wiadomości z grup dołączonych jawnie (np. opcją
IP_ADD_MEMBERSHIP) do tego konkretnego gniazda.
IP_MULTICAST_IF (od Linuksa 1.2)
Ustawia lokalne urządzenie dla gniazda grupowego. Argumentem do setsockopt(2) jest ip_mreqn lub
(od Linuksa 3.5) ip_mreq, struktura podobna do IP_ADD_MEMBERSHIP; albo struktura in_addr (jądro
określa którą strukturę się podało na podstawie rozmiaru przekazanego w optlen). Do getsockopt(2)
argumentem jest struktura in_addr.
IP_MULTICAST_LOOP (od Linuksa 1.2)
Ustawia lub pobiera logiczny argument typu całkowitego, określający, czy przesyłane pakiety
grupowe powinny wracać do lokalnego gniazda.
IP_MULTICAST_TTL (od Linuksa 1.2)
Ustawia lub pobiera wartość czasu życia pakietu dla wychodzących z tego gniazda pakietów
grupowych. Jest bardzo istotne w przypadku adresowania grupowego, by ustawić najmniejszą możliwą
wartość TTL. Domyślnie jest to 1, co oznacza, że pakiety grupowe nie opuszczają sieci lokalnej,
chyba że program użytkownika wyraźnie tego żąda. Argument jest liczbą całkowitą.
IP_NODEFRAG (od Linuksa 2.6.36)
Jeśli włączone (argument jest niezerowy), łączenie pakietów wychodzących przez warstwę netfilter
jest wyłączone. Argumentem jest liczba całkowita.
Ta opcja jest prawidłowa tylko dla gniazd SOCK_RAW.
IP_OPTIONS (od Linuksa 2.0)
Set or get the IP options to be sent with every packet from this socket. The arguments are a
pointer to a memory buffer containing the options and the option length. The setsockopt(2) call
sets the IP options associated with a socket. The maximum option size for IPv4 is 40 bytes. See
RFC 791 for the allowed options. When the initial connection request packet for a SOCK_STREAM
socket contains IP options, the IP options will be set automatically to the options from the
initial packet with routing headers reversed. Incoming packets are not allowed to change options
after the connection is established. The processing of all incoming source routing options is
disabled by default and can be enabled by using the accept_source_route /proc interface. Other
options like timestamps are still handled. For datagram sockets, IP options can be set only by
the local user. Calling getsockopt(2) with IP_OPTIONS puts the current IP options used for
sending into the supplied buffer.
IP_PASSSEC (since Linux 2.6.17)
If labeled IPSEC or NetLabel is configured on the sending and receiving hosts, this option enables
receiving of the security context of the peer socket in an ancillary message of type SCM_SECURITY
retrieved using recvmsg(2). This option is supported only for UDP sockets; for TCP or SCTP
sockets, see the description of the SO_PEERSEC option below.
The value given as an argument to setsockopt(2) and returned as the result of getsockopt(2) is
an integer boolean flag.
The security context returned in the SCM_SECURITY ancillary message is of the same format as the
one described under the SO_PEERSEC option below.
Note: the reuse of the SCM_SECURITY message type for the IP_PASSSEC socket option was likely a
mistake, since other IP control messages use their own numbering scheme in the IP namespace and
often use the socket option value as the message type. There is no conflict currently since the
IP option with the same value as SCM_SECURITY is IP_HDRINCL and this is never used for a control
message type.
IP_PKTINFO (od Linuksa 2.2)
Pass an IP_PKTINFO ancillary message that contains a pktinfo structure that supplies some
information about the incoming packet. This works only for datagram oriented sockets. The
argument is a flag that tells the socket whether the IP_PKTINFO message should be passed or not.
The message itself can be sent/retrieved only as a control message with a packet using recvmsg(2)
or sendmsg(2).
struct in_pktinfo {
unsigned int ipi_ifindex; /* Indeks interfejsu */
struct in_addr ipi_spec_dst; /* Adres lokalny */
struct in_addr ipi_addr; /* Nagłówek adresu
docelowego */
};
ipi_ifindex jest unikatowym indeksem interfejsu, przez który pakiet został odebrany. Adres
ipi_spec_dst jest lokalnym adresem pakietu, a ipi_addr jest adresem docelowym wynikającym z
nagłówka pakietu. Jeśli IP_PKTINFO jest przekazane do sendmsg(2), a ipi_spec_dst ma wartość
niezerową, to zostanie użyte jako źródłowy adres lokalny podczas przeszukiwania tablicy routingu i
dla ustawienia opcji routingu według adresu źródłowego. Gdy ipi_ifindex ma wartość niezerową, to
podstawowy adres lokalny interfejsu wskazywanego przez ten indeks nadpisuje ipi_spec_dst podczas
przeszukiwania tablicy routingu.
IP_RECVERR (od Linuksa 2.2)
Włącza przekazywanie dodatkowych komunikatów o błędach, zwiększając niezawodność połączenia. Gdy
jest to ustawione w gnieździe datagramowym, to wszystkie generowane błędy będą zapamiętane w
specjalnej kolejce błędów przypisanej do gniazda. Gdy użytkownik (proces użytkownika) otrzyma błąd
(przez zwrócony kod błędu operacji na gnieździe), to może go odebrać, używając funkcji recvmsg(2)
z ustawionym znacznikiem MSG_ERRQUEUE. Struktura opisująca błąd sock_extended_err zostanie
przekazana w pomocniczym komunikacie o typie IP_RECVERR i poziomie IPPROTO_IP. Jest to niezwykle
pomocne przy niezawodnym przechwytywaniu błędów niepołączonych gniazd. Odbierana z kolejki błędów
porcja danych zawiera pakiet z informacją o błędzie.
Komunikat sterujący IP_RECVERR zawiera strukturę sock_extended_err zdefiniowaną następująco:
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err {
uint32_t ee_errno; /* numer błędu */
uint8_t ee_origin; /* źródło błędu */
uint8_t ee_type; /* typ */
uint8_t ee_code; /* kod */
uint8_t ee_pad;
uint32_t ee_info; /* informacje dodatkowe */
uint32_t ee_data; /* inne dane */
/* Dalej mogą wystąpić dodatkowe dane */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
ee_errno zawiera numer errno błędu kolejki. ee_origin jest kodem miejsca pochodzenia błędu.
Pozostałe pola są zależne od protokołu. Makro SO_EE_OFFENDER zwraca wskaźnik do adresu obiektu
sieciowego, z którego pochodził błąd o zadanym wskaźniku do komunikatu pomocniczego. Gdy ten adres
nie jest znany, pole sa_family struktury sockaddr zawiera wartość AF_UNSPEC a pozostałe pola tej
struktury sockaddr są niezdefiniowane.
IP używa struktury sock_extended_err w następujący sposób: ee_origin ustawione na
SO_EE_ORIGIN_ICMP dla błędów odbieranych jako pakiet ICMP albo też SO_EE_ORIGIN_LOCAL dla błędów
generowanych lokalnie. Nieznane wartości należy ignorować. ee_type i ee_code są ustawiane zgodnie
z typem i kodem pól w nagłówku ICMP. ee_info zawiera rozpoznaną wartość MTU dla błędów EMSGSIZE.
Komunikat zawiera również sockaddr_in węzła, który spowodował błąd, a do którego można uzyskać
dostęp za pomocą makra SO_EE_OFFENDER. Pole sin_family adresu SO_EE_OFFENDER ma wartość AF_UNSPEC,
gdy źródło błędu nie jest znane. Gdy błąd pochodzi z sieci, wszystkie opcje IP (IP_OPTIONS, IP_TTL
itd.) włączone w gnieździe i zawarte w pakiecie błędu są przekazywane jako komunikaty kontrolne.
Właściwe dane pakietu, który spowodował błąd są zwracane jako normalne dane. Należy zauważyć, że
TCP nie ma kolejki błędów; MSG_ERRQUEUE jest nielegalne w przypadku gniazd SOCK_STREAM. IP_RECVERR
jest poprawne dla TCP, ale wszystkie błędy są przekazywane przez zwracaną wartość funkcji albo
przez SO_ERROR.
For raw sockets, IP_RECVERR enables passing of all received ICMP errors to the application,
otherwise errors are reported only on connected sockets
Ustawia lub pobiera znacznik logiczny zapisany za pomocą liczby całkowitej. IP_RECVERR jest
domyślnie wyłączone.
IP_RECVOPTS (od Linuksa 2.2)
Przekazuje użytkownikowi wszystkie nadchodzące opcje IP z komunikatu sterującego IP_OPTIONS.
Nagłówek wyboru trasy i inne opcje są już wstępnie wypełnione informacjami o lokalnej maszynie.
Nieobsługiwane w przypadku gniazd typu SOCK_STREAM.
IP_RECVORIGDSTADDR (od Linuksa 2.6.29)
Ta opcja logiczna włącza komunikat pomocniczy IP_ORIGDSTADDR w recvmsg(2), w którym jądro zwraca
oryginalny adres docelowy otrzymywanego właśnie datagramu. Ten komunikat pomocniczy zawiera
strukturę struct sockaddr_in.
IP_RECVTOS (od Linuksa 2.2)
Jeśli jest ustawione, to pomocniczy komunikat IP_TOS jest przepuszczany razem z nadchodzącymi
pakietami. Zawiera on bajt, który określa pole zdefiniowane także jako bajt znajdujące się w
nagłówku pakietu, a zwane Typ Usługi/Pierwszeństwa. Wymaga logicznego znacznika w postaci liczby
całkowitej.
IP_RECVTTL (od Linuksa 2.2)
When this flag is set, pass a IP_TTL control message with the time-to-live field of the received
packet as a 32 bit integer. Not supported for SOCK_STREAM sockets.
IP_RETOPTS (od Linuksa 2.2)
Działanie identyczne do IP_RECVOPTS, ale zwraca surowe, nieprzetworzone opcje, włącznie z rekordem
opcji, mówiącym o znaczniku czasowym i trasie, niewypełnionym wartościami w tym przejściu pakietu.
IP_ROUTER_ALERT (od Linuksa 2.2)
Pass all to-be forwarded packets with the IP Router Alert option set to this socket. Valid only
for raw sockets. This is useful, for instance, for user-space RSVP daemons. The tapped packets
are not forwarded by the kernel; it is the user's responsibility to send them out again. Socket
binding is ignored, such packets are filtered only by protocol. Expects an integer flag.
IP_TOS (od Linuksa 1.0)
Ustawia lub pobiera pole znacznika Typ-Usługi (ang. Type-Of-Service, w skrócie TOS), które jest
przesyłane z każdym pakietem IP pochodzącym z danego gniazda. Służy do ustalenia priorytetów
pakietów w sieci. TOS jest bajtem. Oto definicje niektórych standardowych znaczników TOS:
IPTOS_LOWDELAY - minimalizacja opóźnienia we wzajemnym ruchu, IPTOS_THROUGHPUT - optymalizacja
wyjścia, IPTOS_RELIABILITY - optymalizacja pod kątem niezawodności, a IPTOS_MINCOST powinna być
używana jako "dane wypełniające" tam, gdzie szybkość transmisji nie ma większego znaczenia. Można
podać najwyżej jedną z powyższych wartości TOS. Inne bity są niepoprawne i powinny być wyzerowane.
Linux domyślnie wysyła najpierw datagram IPTOS_LOWDELAY, ale dokładne zachowanie zależy od
konfiguracji właściwości szeregowania. Niektóre poziomy o wysokim priorytecie mogą wymagać
uprawnień administratora (ustawionego atrybutu CAP_NET_ADMIN).
IP_TRANSPARENT (od Linuksa 2.6.24)
Ustawienie tej opcji logicznej włącza przezroczyste (ang. "transparent") proxy dla tego gniazda.
Ta opcja gniazda pozwala wywołującej aplikacji przypisanie gniazda do nielokalnego adresu IP i
operowanie jako zarówno klient, jak i serwer z zewnętrznym adresem IP dla lokalnego punktu
docelowego. UWAGA: wymaga to takiego ustawienia reguł routingu, żeby pakiety wysyłane na ten adres
zewnętrzny były przekazywane przez TProxy (tj. system na którym działa aplikacja korzysta z opcji
gniazda IP_TRANSPARENT). Włączenie tej opcji wymaga uprawnień administratora (właściwość
CAP_NET_ADMIN).
Przekierowanie TProxy używające celu TPROXY z iptables(8) także wymagają włączenia tej opcji w
przekierowywanym gnieździe.
IP_TTL (od Linuksa 1.0)
Ustawia lub pobiera pole "czas życia" (ang. Time-To-Live, w skrócie TTL) dla każdego wychodzącego
z danego gniazda pakietu IP.
IP_UNBLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
Odblokowuje zablokowaną uprzednio grupę adresów. Zwraca EADDRNOTAVAIL gdy podane źródło nie było
zablokowane.
Argumentem jest struktura ip_mreq_source opisana w części dotyczącej IP_ADD_SOURCE_MEMBERSHIP.
SO_PEERSEC (since Linux 2.6.17)
If labeled IPSEC or NetLabel is configured on both the sending and receiving hosts, this read-only
socket option returns the security context of the peer socket connected to this socket. By
default, this will be the same as the security context of the process that created the peer socket
unless overridden by the policy or by a process with the required permissions.
The argument to getsockopt(2) is a pointer to a buffer of the specified length in bytes into
which the security context string will be copied. If the buffer length is less than the length of
the security context string, then getsockopt(2) returns -1, sets errno to ERANGE, and returns the
required length via optlen. The caller should allocate at least NAME_MAX bytes for the buffer
initially, although this is not guaranteed to be sufficient. Resizing the buffer to the returned
length and retrying may be necessary.
The security context string may include a terminating null character in the returned length, but
is not guaranteed to do so: a security context "foo" might be represented as either {'f','o','o'}
of length 3 or {'f','o','o','\0'} of length 4, which are considered to be interchangeable. The
string is printable, does not contain non-terminating null characters, and is in an unspecified
encoding (in particular, it is not guaranteed to be ASCII or UTF-8).
The use of this option for sockets in the AF_INET address family is supported since Linux 2.6.17
for TCP sockets, and since Linux 4.17 for SCTP sockets.
For SELinux, NetLabel conveys only the MLS portion of the security context of the peer across the
wire, defaulting the rest of the security context to the values defined in the policy for the
netmsg initial security identifier (SID). However, NetLabel can be configured to pass full
security contexts over loopback. Labeled IPSEC always passes full security contexts as part of
establishing the security association (SA) and looks them up based on the association for each
packet.
Interfejsy /proc
Protokół IP obsługuje zbiór interfejsów /proc i korzysta z niech do ustawiania niektórych parametrów
globalnych. Parametry są dostępne przez zapis lub odczyt plików z katalogu /proc/sys/net/ipv4/.
Interfejsy opisane jako logiczne pobierają liczbę całkowitą, której wartość niezerowa ("prawda") oznacza,
że dana opcja jest włączona, a zero ("fałsz"), oznacza, że opcja jest wyłączona.
ip_always_defrag (logiczna; od Linuksa 2.2.13)
[Nowa w jądrze 2.2.13; we wcześniejszych wersjach jądra funkcją tą sterowało się w czasie
kompilacji za pomocą opcji CONFIG_IP_ALWAYS_DEFRAG, która nie jest już obecna w 2.4.x i kolejnych]
Gdy ten znacznik logiczny jest włączony (różny od 0), przychodzące fragmenty (części pakietów IP,
które się pojawiają, gdy pewien komputer pomiędzy komputerem źródłowym a docelowym zdecyduje, że
pakiety były za duże i podzieli je na kawałki) będą ponownie złożone (zdefragmentowane) przed ich
przetworzeniem, nawet jeśli mają być przekazane dalej (and. forwarded).
Enable only if running either a firewall that is the sole link to your network or a transparent
proxy; never ever use it for a normal router or host. Otherwise, fragmented communication can be
disturbed if the fragments travel over different links. Defragmentation also has a large memory
and CPU time cost.
Jest to włączane automagicznie, gdy skonfigurowane jest maskowanie lub przezroczyste proxy.
ip_autoconfig (od Linuksa 2.2 do 2.6.17)
Nie udokumentowane.
ip_default_ttl (liczba, domyślnie: 64; od Linuksa 2.2)
Ustawia domyślną wartość "czasu życia" (ang. time-to-live) wychodzących pakietów. Może być ona
zmieniona dla gniazda za pomocą opcji IP_TTL.
ip_dynaddr (logiczna; domyślnie: wyłączona; od Linuksa 2.0.31)
Włącza dynamiczne adresowanie gniazda oraz przepisywanie adresu dla maskowania przy zmianie adresu
interfejsu. Jest to bardzo przydatne w przypadku korzystania z interfejsu sprzęgniętego z linią
telefoniczną, którego adres IP może się zmieniać. 0 oznacza brak przepisywania, 1 włącza
przepisywanie, a 2 włącza tryb rozwlekły (ang. verbose).
ip_forward(logiczna; domyślnie: wyłączona; od Linuksa 1.2)
Włącza przekazywanie (ang. forwarding) pakietów przy użyciu logicznego znacznika. Może być
ustawione także na podstawie interfejsu.
ip_local_port_range (od Linuksa 2.2)
Plik zawierający dwa liczby całkowite określające domyślny zakres lokalnych portów przypisanych do
gniazd niebędących bezpośrednio przydzielonych do portu - tj. zakres ten jest używany do portów
efemerycznych (portów przypisywanych dynamicznie). Port efemeryczny jest przydzielany do gniazda w
następujących sytuacjach:
* numer portu w adresie gniazda jest określony jako 0 w trakcie wywoływania bind(2);
* listen(2) jest wywoływane na gnieździe strumieniowych, które nie było wcześniej przydzielone;
* connect(2) była wywołana na gnieździe, które nie było wcześniej przydzielone;
* sendto(2) jest wywoływane na gnieździe datagramowym, które nie było wcześniej przydzielone.
Przypisywanie portów efemerycznych rozpoczyna się od pierwszego numeru w ip_local_port_range i
kończy się na drugim numerze. Jeśli wyczerpie się zakres portów efemerycznych, to odpowiednie
wywołanie systemowe zwróci błąd (ale proszę sprawdzić rozdział BŁĘDY!).
Proszę zauważyć, że zakres portów w ip_local_port_range nie powinien pokrywać się z zakresem
portów wykorzystywanym do maskowania (chociaż taka sytuacja jest obsługiwana). Dowolny wybór może
również powodować problemy z niektórymi zaporami sieciowymi, które robią pewne założenia odnośnie
do portów używanych lokalnie. Pierwsza liczba powinna być większa niż 1024, albo - co byłoby
lepsze - większa niż 4096, aby uniknąć konfliktów z dobrze znanymi portami i zminimalizować
problemy z zaporami sieciowymi.
ip_no_pmtu_disc (logiczna; domyślnie: wyłączona; od Linuksa 2.2)
Jeśli jest to włączone, to domyślnie nie będzie wykonywane badanie MTU ścieżki dla gniazd TCP.
Badanie MTU może się nie sprawdzać w przypadku źle skonfigurowanych firewalli (odrzucających
wszelkie pakiety ICMP) lub źle skonfigurowanych interfejsów (np. połączenie typu point-to-point,
gdzie oba końce nie zgadzają się na MTU). Lepiej poprawić wszelkie wadliwie skonfigurowane rutery
po drodze niż całkowicie wyłączyć badanie MTU ścieżki, ponieważ niewykonywanie tej operacji
pociąga za sobą duże straty w obrębie sieci.
ip_nonlocal_bind (logiczna; domyślnie: wyłączona; od Linuksa 2.4)
Jeżeli ustawione, pozwala procesowi na wywołanie funkcji bind() z nielokalnym adresem IP, co może
być całkiem przydatne, ale może popsuć niektóre aplikacje.
ip6frag_time (liczba; domyślnie: 30)
Czas w sekundach przetrzymywania w pamięci fragmentu IPv6.
ip6frag_secret_interval (liczba; domyślnie: 600)
Interwał (w sekundach) odświeżania sekretnego klucza funkcji mieszkającej (lub czasu życia tego
klucza) dla fragmentów IPv6.
ipfrag_high_thresh (liczba), ipfrag_low_thresh (liczba)
Jeśli liczba zebranych w kolejce fragmentów IP osiągnie wartość określoną przez
ipfrag_high_thresh, wtedy kolejka jest opróżniana do ilości określonej w ipfrag_low_thresh.
Zawiera ona liczbę całkowitą z podaną liczbą bajtów.
neigh/*
Patrz arp(7).
Kontrolki systemowe (ioctl)
Do protokołu ip mają zastosowanie wszystkie kontrolki wejścia/wyjścia opisane w socket(7).
Kontrolki konfigurowania ogólnych parametrów urządzenia są opisane w netdevice(7).
BŁĘDY
EACCES Użytkownik próbował wykonać operację, nie mając potrzebnych praw. Obejmuje to: wysyłanie pakietu
na adres rozgłoszeniowy bez ustawionego znacznika SO_BROADCAST, wysyłanie pakietu zakazaną drogą,
próbę modyfikacji ustawień firewalla, nie mając uprawnień administratora (ustawionego znacznika
CAP_NET_ADMIN), próbę przypisania uprzywilejowanego portu, nie mając uprawnień administratora
(ustawionego znacznika CAP_NET_BIND_SERVICE).
EADDRINUSE
Próbowano przypisać port do adresu będącego już w użyciu.
EADDRNOTAVAIL
Zażądano nieistniejącego interfejsu lub żądany adres źródłowy nie jest adresem lokalnym.
EAGAIN Operacja na gnieździe z wyłączonym blokowaniem spowodowałaby zablokowanie.
EALREADY
A connection operation on a nonblocking socket is already in progress.
ECONNABORTED
Połączenie zostało zamknięte podczas accept(2).
EHOSTUNREACH
No valid routing table entry matches the destination address. This error can be caused by an ICMP
message from a remote router or for the local routing table.
EINVAL Przypisano niewłaściwy argument. W przypadku operacji wysyłania może to być spowodowane przez
wysyłanie drogą przypisaną do czarnej dziury.
EISCONN
connect(2) była wywołana na już połączonym gnieździe.
EMSGSIZE
Datagram jest większy niż wartość MTU po drodze do celu i nie może być podzielony.
ENOBUFS, ENOMEM
Niewystarczająca ilość dostępnej pamięci. Często oznacza to, że przydzielanie pamięci jest
ograniczone przez ograniczenia bufora gniazda, a nie przez ograniczenia pamięci systemowej. Jednak
nie jest to pewne na 100%.
ENOENT SIOCGSTAMP było wywołane na gnieździe, do którego nie dotarł żaden pakiet.
ENOPKG Podsystem jądra nie był konfigurowany.
ENOPROTOOPT i EOPNOTSUPP
Przypisano niewłaściwą opcję gniazda.
ENOTCONN
Operacja może być wykonana tylko na połączonym gnieździe, a gniazdo nie zostało połączone.
EPERM Użytkownik nie ma praw do ustawiania wysokiego priorytetu, zmiany konfiguracji lub wysyłania
sygnałów do żądanych procesów lub grup procesów.
EPIPE Połączenie zostało nieoczekiwanie zamknięte lub wyłączył się drugi koniec.
ESOCKTNOSUPPORT
Gniazdo nie jest skonfigurowane lub zażądano nieznanego typu gniazda.
Inne błędy mogą być generowane przez protokoły wyższych warstw; obejrzyj tcp(7), raw(7), udp(7) i
socket(7).
UWAGI
IP_FREEBIND, IP_MSFILTER, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PASSSEC, IP_PKTINFO,
IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT are Linux-specific.
Należy być bardzo ostrożnym przy stosowaniu opcji SO_BROADCAST - nie jest ona w systemie Linux
uprzywilejowana, jest więc łatwo przeciążyć sieć za pomocą niedbale użytych rozgłoszeń. W przypadku
protokołów nowych aplikacji lepiej używać grupy adresowej zamiast rozgłoszeń. Stosowanie adresów
rozgłoszeniowych jest niezalecane.
Niektóre inne implementacje gniazd BSD dopuszczają dla gniazd opcje IP_RCVDSTADDR i IP_RECVIF używane do
pobierania adresu przeznaczenia i interfejsu odbieranych datagramów. Linux udostępnia bardziej ogólną
opcję IP_PKTINFO, robiącą to samo.
Niektóre implementacja gniazd BSD także udostępniają opcję IP_RECVTTL, ale łącznie z przychodzącym
pakietem jest przekazywany pomocniczy komunikat o typie IP_RECVTTL. W tym właśnie różni się to od opcji
IP_TTL, używanej w Linuksie.
Using the SOL_IP socket options level isn't portable; BSD-based stacks use the IPPROTO_IP level.
INADDR_ANY (0.0.0.0) and INADDR_BROADCAST (255.255.255.255) are byte-order-neutral.
This means htonl(3) has no effect on them.
Zgodność
Dla zgodności z Linuksem 2.0, wciąż jest dopuszczalna przestarzała składnia socket(AF_INET, SOCK_PACKET,
protokół), by stworzyć gniazdo typu packet(7). Nie jest to zbyt poprawne i powinno być zastępowane przez
socket(AF_PACKET, SOCK_RAW, protokół). Głównym powodem jest różnica w strukturze adresowej sockaddr_ll
przechowującej informacje dla warstwy łącza (dokładniej: warstwy kanałowej), które kiedyś przechowywane
były w sockaddr_pkt.
BŁĘDY
Jest zbyt wiele nieokreślonych wartości błędów.
Błąd używany do zdiagnozowania wyczerpania się zakresu portów efemerycznych różni się między
poszczególnymi wywołaniami systemowymi (connect(2), bind(2), listen(2), sendto(2)), które przypisują
porty efemeryczne.
Nie są opisane kontrolki wejścia/wyjścia do konfigurowania specyficznych dla IP opcji interfejsu i tabele
ARP.
Pobieranie pierwotnego adresu docelowego za pomocą wywołania recvmsg(2) z MSG_ERRQUEUE w msg_name nie
działa w niektórych jądrach 2.2.
ZOBACZ TAKŻE
recvmsg(2), sendmsg(2), byteorder(3), capabilities(7), icmp(7), ipv6(7), netdevice(7), netlink(7),
raw(7), socket(7), tcp(7), udp(7), ip(8)
The kernel source file Documentation/networking/ip-sysctl.txt.
RFC 791 - oryginalny opis IP. RFC 1122 - wymagania stacji IPv4. RFC 1812 - wymagania rutera IPv4.
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux man-pages. Opis projektu, informacje
dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem
https://www.kernel.org/doc/man-pages/.
T◈UMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Paweł Wilk <siefca@pl.qmail.org>, Robert
Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ
ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-
list@lists.sourceforge.net.
Linux 1 listopada 2020 r. IP(7)