Title: Socket Options
1Socket Options
2abstraction
- Introduction
- getsockopt and setsockopt function
- socket state
- Generic socket option
- IPv4 socket option
- ICMPv6 socket option
- IPv6 socket option
- TCP socket option
- fcnl function
3Introduction
- Three ways to get and set the socket option that
affect a socket - getsockopt , setsockopt functiongtIPv4 and IPv6
multicasting options - fcntl function gtnonblocking I/O, signal driven
I/O - ioctl function gtchapter16
4getsockopt and setsockopt function
- include ltsys/socket.hgt
- int getsockopt(int sockfd, , int level, int
optname, void optval, socklent_t optlen) - int setsockopt(int sockfd, int level , int
optname, const void optval, socklent_t optlen) - sockfd gt open socket descriptor
- level gt code in the system to interprete the
option(generic, IPv4, IPv6, TCP) - optval gt pointer to a variable from which the
new value of option is fetched by setsockopt, or
into which the current value of the option is
stored by setsockopt. - optlen gt the size of the option variable.
5Generic socket option
- SO_BROCAST gtenable or disable the ability of the
process to send broadcast message.(only datagram
socket Ethernet, token ring..) - SO_DEBUG gtkernel keep track of detailed
information about all packets sent or received by
TCP(only supported by TCP) - SO_DONTROUTEgtoutgoing packets are to bypass the
normal routing mechanisms of the underlying
protocol. - SO_ERRORgtwhen error occurs on a socket, the
protocol module in a Berkeley-derived kernel sets
a variable named so_error for that socket.
Process can obtain the value of so_error by
fetching the SO_ERROR socket option
6SO_KEEPALIVE
- SO_KEEPALIVEgtwait 2hours, and then TCP
automatically sends a keepalive probe to the
peer. - Peer response
- ACK(everything OK)
- RST(peer crashed and rebooted)ECONNRESET
- no responseETIMEOUT gtsocket closed
- example Rlogin, Telnet
- Normally used by servers
7SO_LINGER
- SO_LINGER gtspecify how the close function
operates for a connection-oriented
protocol(defaultclose returns immediately) - struct linger
- int l_onoff / 0 off, nonzero on
/ - int l_linger /linger time second/
-
- l_onoff 0 turn off , l_linger is ignored
- l_onoff nonzero and l_linger is 0TCP abort
the connection (send RST), discard any remaining
data in send buffer. - l_onoff nonzero and l_linger is nonzero
process wait until remained data sending, or
until linger time expired. If socket has been set
nonblocking it will not wait for the close to
complete, even if linger time is nonzero.
8SO_LINGER
client
server
write
data
Data queued by TCP
Close close returns
FIN
Ack of data and FIN
Application reads queued data and FIN close
FIN
Ack of data and FIN
Default operation of closeit returns immediately
9SO_LINGER
client
server
write
data
Data queued by TCP
Close
FIN
Ack of data and FIN
close returns
Application reads queued data and FIN close
FIN
Ack of data and FIN
Close with SO_LINGER socket option set and
l_linger a positive value
10SO_LINGER
client
server
write
data
Data queued by TCP
Shutdown read block
FIN
Ack of data and FIN
Application reads queued data and FIN close
FIN
read returns 0
Ack of data and FIN
Using shutdown to know that peer has received our
data
11- An way to know that the peer application has read
the data - use an application-level ack or application ACK
- client
- char ack
- Write(sockfd, data, nbytes) // data from client
to server - nRead(sockfd, ack, 1) // wait for
application-level ack - server
- nbytesRead(sockfd, buff, sizeof(buff)) //data
from client - //server verifies it received the correct amount
of data from - // the client
- Write(sockfd, , 1)//servers ACK back to client
12(No Transcript)
13(No Transcript)
14SO_RCVBUF , SO_SNDBUF
- let us change the default send-buffer,
receive-buffer size. - Default TCP send and receive buffer size
- 4096bytes
- 8192-61440 bytes
- Default UDP buffer size 9000bytes, 40000 bytes
- SO_RCVBUF option must be setting before
connection established. - For client, it should be before calling connect()
- For server it should be before calling listen()
- TCP socket buffer size should be at least three
times the MSSs
15SO_RCVLOWAT , SO_SNDLOWAT
- Every socket has a receive low-water mark and
send low-water mark.(used by select function) - Receive low-water mark
- the amount of data that must be in the socket
receive buffer for select to return readable. - Default receive low-water mark 1 for TCP and
UDP - Send low-water mark
- the amount of available space that must exist in
the socket send buffer for select to return
writable - Default send low-water mark 2048 for TCP
- UDP send buffer never change because dose not
keep a copy of send datagram.
16SO_RCVTIMEO, SO_SNDTIMEO
- allow us to place a timeout on socket receives
and sends. - Default disabled
17SO_REUSEADDR, SO_REUSEPORT
- Allow a listening server to start and bind its
well known port even if previously established
connection exist that use this port as their
local port. - Allow multiple instance of the same server to be
started on the same port, as long as each
instance binds a different local IP address. - Allow a single process to bind the same port to
multiple sockets, as long as each bind specifies
a different local IP address. - Allow completely duplicate bindings multicasting
18SO_TYPE
- Return the socket type.
- Returned value is such as SOCK_STREAM,
SOCK_DGRAM...
19SO_USELOOPBACK
- This option applies only to sockets in the
routing domain(AF_ROUTE). - The socket receives a copy of everything sent on
the socket.
20IPv4 socket option
- Level gt IPPROTO_IP
- IP_HDRINCL gt If this option is set for a raw IP
socket, we must build our IP header for all the
datagrams that we send on the raw socket.
21IPv4 socket option
- IP_OPTIONSgtallows us to set IP option in IPv4
header.(chapter 24) - IP_RECVDSTADDRgtThis socket option causes the
destination IP address of a received UDP datagram
to be returned as ancillary data by
recvmsg.(chapter20)
22IP_RECVIF
- Cause the index of the interface on which a UDP
datagram is received to be returned as ancillary
data by recvmsg.(chapter20)
23IP_TOS
- lets us set the type-of-service(TOS) field in IP
header for a TCP or UDP socket. - If we call getsockopt for this option, the
current value that would be placed into the
TOS(type of service) field in the IP header is
returned
24IP_TTL
- We can set and fetch the default TTL(time to live
field).
25ICMPv6 socket option
- This socket option is processed by ICMPv6 and has
a level of IPPROTO_ICMPV6. - ICMP6_FILTER gtlets us fetch and set an
icmp6_filter structure that specifies which of
the 256possible ICMPv6 message types are passed
to the process on a raw socket.(chapter 25)
26IPv6 socket option
- This socket option is processed by IPv6 and have
a level of IPPROTO_IPV6. - IPV6_ADDRFORMgtallow a socket to be converted
from IPv4 to IPv6 or vice versa.(chapter 10) - IPV6_CHECKSUMgtspecifies the byte offset into the
user data of where the checksum field is located.
27IPV6_DSTOPTS
- Specifies that any received IPv6 destination
options are to be returned as ancillary data by
recvmsg.
28IPV6_HOPLIMIT
- Setting this option specifies that the received
hop limit field be returned as ancillary data by
recvmsg.(chapter 20) - Default off.
29IPV6_HOPOPTS
- Setting this option specifies that any received
IPv6 hop-by-hop option are to be returned as
ancillary data by recvmsg.(chapter 24)
30IPV6_NEXTHOP
- This is not a socket option but the type of an
ancillary data object that can be specified to
sendmsg. This object specifies the next-hop
address for a datagram as a socket address
structure.(chapter20)
31IPV6_PKTINFO
- Setting this option specifies that the following
two pieces of infoemation about a received IPv6
datagram are to be returned as ancillary data by
recvmsgthe destination IPv6 address and the
arriving interface index.(chapter 20)
32IPV6_PKTOPTIONS
- Most of the IPv6 socket options assume a UDP
socket with the information being passed between
the kernel and the application using ancillary
data with recvmsg and sendmsg. - A TCP socket fetch and store these values using
IPV6_ PKTOPTIONS socket option.
33IPV6_RTHDR
- Setting this option specifies that a received
IPv6 routing header is to be returned as
ancillary data by recvmsg.(chapter 24) - Default off
34IPV6_UNICAST_HOPS
- This is similar to the IPv4 IP_TTL.
- Specifies the default hop limit for outgoing
datagram sent on the socket, while fetching the
socket option returns the value for the hop limit
that the kernel will use for the socket.
35TCP socket option
- There are five socket option for TCP, but three
are new with Posix.1g and not widely supported. - Specify the level as IPPROTO_TCP.
36TCP_KEEPALIVE
- This is new with Posix.1g
- It specifies the idle time in second for the
connection before TCP starts sending keepalive
probe. - Default 2hours
- this option is effective only when the
SO_KEEPALIVE socket option enabled.
37TCP_MAXRT
- This is new with Posix.1g.
- It specifies the amount of time in seconds before
a connection is broken once TCP starts
retransmitting data. - 0 use default
- -1retransmit forever
- positive valuerounded up to next transmission
time
38TCP_MAXSEG
- This allows us to fetch or set the maximum
segment size(MSS) for TCP connection.
39TCP_NODELAY
- This option disables TCPs Nagle algorithm.
- (default this algorithm enabled)
- purpose of the Nagle algorithm.
- gtprevent a connection from having multiple
small packets outstanding at any time. - Small packet gt any packet smaller than MSS.
40Nagle algorithm
- Default enabled.
- Reduce the number of small packet on the WAN.
- If given connection has outstanding data , then
no small packet data will be sent on connection
until the existing data is acknowledged.
41Nagle algorithm disabled
h
0
250
e
500
l
750
l
1000
o
1250
!
1500
1500
1750
2000
42Nagle algorithm enabled
h
h
0
250
e
500
l
el
750
l
1000
o
1250
!
lo
1500
1500
1750
!
2000
2250
2500
43fcntl function
- File control
- This function perform various descriptor control
operation. - Provide the following features
- Nonblocking I/O(chapter 15)
- signal-driven I/O(chapter 22)
- set socket owner to receive SIGIO signal.
- (chapter 21,22)
44- include ltfcntl.hgt
- int fcntl(int fd, int cmd, ./ int arg /)
- Returnsdepends on cmd if
OK, -1 on error - O_NONBLOCK nonblocking I/O
- O_ASYNC signal driven I/O
notification -
45Nonblocking I/O using fcntl
- Int flags
- / set socket nonblocking /
- if((flags fcntl(fd, f_GETFL, 0)) lt 0)
- err_sys(F_GETFL error)
- flags O_NONBLOCK
- if(fcntl(fd, F_SETFL, flags) lt 0)
- err_sys(F_ SETFL error)
-
each descriptor has a set of file flags that
fetched with the F_GETFL command and set with
F_SETFL command.
46Misuse of fcntl
- / wrong way to set socket nonblocking /
- if(fcntl(fd, F_SETFL,O_NONBLOCK) lt 0)
- err_sys(F_ SETFL error)
- / because it also clears all the other file
status flags./
47Turn off the nonblocking flag
- Flags O_NONBLOCK
- if(fcntl(fd, F_SETFL, flags) lt 0)
- err_sys(F_SETFL error)
48F_SETOWN
- The integer arg value can be either
positive(process ID) or negative (group ID)value
to receive the signal. - F_GETOWN gt retrurn the socket owner by fcntl
function, either process ID or process group ID.
49(No Transcript)
50(No Transcript)