IPv6 Socket Programming
2004.10.6 Joonbok Lee KAIST
Contents
1. Socket 2. IPv6 3. IPv6 Socket Programming
1. Socket
1.1 What is a socket?
Socket
The combination of an IP address and a port number. (RFC 793 ,original TCP specification) The name of the Berkeley-derived application programming interfaces (APIs) for applications using TCP/IP protocols. Two types
Stream socket : reliable two-way connected communication streams Datagram socket
Socket pair
Specify the two end points that uniquely identifies each TCP connection in an internet. 4-tuple: (client IP address, client port number, server IP address, server port number)
1.2 Client-server applications
Implementation of a protocol standard defined in an RFC. (FTP, HTTP, SMTP)
Conform to the rules dictated by the RFC. Should use the port number associated with the protocol.
Proprietary client-server application.
A single developer( or team) creates both client and server program. The developer has complete control. Must be careful not to use one of the well-known port number defined in the RFCs. * well-known port number : managed by the Internet Assigned Numbers Authority(IANA)
1.3 Socket Programming with TCP
Figure 2.6-1: Processes communicating through TCP sockets
The application developer has the ability to fix a few TCP parameters, such as maximum buffer and maximum segment sizes.
1.4 Sockets
Figure 2.6-2: Client socket, welcoming socket and connection socket
1.5 Sockets for server and client
Server
Welcoming socket
Welcomes some initial contact from a client. It is created at initial contact of client. New socket that is dedicated to the particular client.
Connection socket
Client
Client socket
Initiate a TCP connection to the server by creating a socket object. (Three-way handshake) Specify the address of the server process, namely, the IP address of the server and the port number of the process.
1.6 Socket Programming- TCP
client
socket( ) bind( ) connect( ) send( )
server
socket( ) bind( ) listen( ) TCP conn. request TCP ACK
accept( )
recv( )
recv( ) close( )
send( ) close( )
2. IPv6
2.1 IPv4 and IPv6
IPv4
RFC 791, which was published in 1981 32bit address space: 4,294,967,296 (232) addresses
IPv6
128bit address space: 3.4 x 1038
67billion billion addresses per cm2 of the planet space.
Hierarchical address architecture Security (built-in IPsec) Autoconfiguration IETF IPv6 Working Group
2.2 IPv6 Address
RFC 2373 x:x:x:x:x:x:x:x (x is 16bit) ex) 3ffe:8041:2:1:bc16:6ee6:26ab:7ba8 :: indicates multiple groups of 16 bits of zeros. ex) 3ffe:8041:0:0:0:0:0:3 3ffe:8041::3 IPv6 Address Structure: Prefix + Interface ID ex) 3ffe:8041:2:1:bc16:6ee6:26ab:7ba8/64
2.3 Example
eth0 Link encap:Ethernet HWaddr 00:04:76:2F:CC:34 inet addr:134.75.85.132 Bcast:134.75.255.255 Mask:255.255.255.224 inet6 addr: 2001:320:1a10:3:204:76ff:fe2f:cc34/64 Scope:Global inet6 addr: fe80::204:76ff:fe2f:cc34/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1595908 errors:0 dropped:0 overruns:0 frame:0 TX packets:24722783 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1091245010 (1040.6 Mb) TX bytes:1288208803 (1228.5 Mb) Interrupt:177
3. IPv6 Socket Programming
3.1 Goal
Develope IPv6-aware (or IPv6-enable) application.
Application Type
IPv4-only: not able to handle IPv6 addresses IPv6-aware: can communicate with nodes that do not have IPv4 addresses IPv6-enable: in addition to being IPv6-aware, takes advantage of some IPv6 specific features such as flow labels IPv6-required: requires some IPv6 specific feature and therefore cannot operate over IPv4
3.2 Changes socket API for IPv6 Support
New socket address structure to carry IPv6 address New address conversion functions and several new socket options RFC 3493
3.3 Typical IPv6 Code sequence
Same with IPv4
Server
Socket open a socket Bind bind our local address to the socket Listen tell that we are listening to a port Accept wait for connection Read and/or write if TCP Recvfrom and/or sendto if UDP
Client
Socket open a socket Connect connect to the server Read and/or write if TCP Recvfrom and/or sendto if UDP
3.4 What need to be changed
Socket Interface
New protocol family name: PF_INET6
Address data structures
Net address family name: AF_INET6 in6_addr structure sockaddr_in6 structure
Name-to-address translation functions
inet_pton, inet_ntop
Address conversion functions
getnameinfo getaddrinfo
3.5 IPv6-enable application example
Client
int main(int argc, char **argv){
char Buffer[BUFFER_SIZE]; char *Server = DEFAULT_SERVER; /* 143.248.226.231 2001:320:1a10:3:204:76ff:fe2f:cc34 cosmos.kaist.ac.kr */ int Family = DEFAULT_FAMILY; /* AF_INET, AF_INET6, AF_UNSPEC */ int SocketType = DEFAULT_SOCKTYPE; /* SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, */ char *Port = DEFAULT_PORT; int i, RetVal, AddrLen, AmountToSend; struct addrinfo Hints, *AddrInfo, *AI; socket ConnSocket; struct sockaddr_storage Addr;
memset(&Hints, 0, sizeof(Hints)); Hints.ai_family = AF_UNSPEC; /* AF_INET: IPv4 address, AF_INET6: IPv6 address, AF_UNSPEC: IPv4 and IPv6 address */ Hints.ai_socktype = SOCK_STREAM; /* SOCK_STREAM: TCP, SOCK_DGRAM: UDP */ RetVal = getaddrinfo(Server, Port, &Hints, &AddrInfo); if (RetVal != 0) { fprintf(stderr, "Cannot resolve address [%s] and port [%s], error %d: %s\n", Server, Port, RetVal, gai_strerror(RetVal)); return -1; } for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) { // Open a socket with the correct address family for this address. // if( AI->ai_family == AF_INET6 ){ ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI-> ai_protocol); if (ConnSocket == INVALID_SOCKET) continue; if (connect(ConnSocket, AI->ai_addr, AI->ai_addrlen) != SOCKET_ERROR) break; // } } freeaddrinfo(Addrinfo);
strcpy(Buffer, Hello, world); AmmountToSend = strlen(Buffer); RetVal = send(ConnSocket, Buffer, AmmountToSend, 0); RetVal = recv(ConnSocket, Buffer, Buffer, BUFFER_SIZE, 0); closesocket(ConnSocket); }
Server
#define MAXSOCK 2 struct addrinfo hints, *res; struct sockaddr_storage from; int error, sockfd[MAXSOCK], nsock=0, connsock, fromlen; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(NULL, SERVICE, &hints, &res); if (error != 0) { /* handle getaddrinfo error */ }
for (aip=res; aip && nsock < MAXSOCK; aip=aip->ai_next) { sockfd[nsock] = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol); if (sockfd[nsock] < 0) { /* handle socket error */ }
else { int on = 1; /* optional: works better if dual-binding to wildcard address */ if (aip->ai_family == AF_INET6) { setsockopt(sockfd[nsock], IPPROTO_IPV6, IPV6_V6ONLY, (char *)&on, sizeof(on)); /* errors are ignored */ } if (bind(sockfd[nsock], aip->ai_addr, aip->ai_addrlen) < 0 ) { /* handle bind error */ close(sockfd[nsock]); continue; } if (listen(sockfd[nsock], SOMAXCONN) < 0) { /* handle listen errors */ close(sockfd[nsock]); continue; }
nsock++;
} freeaddrinfo(res); /* check that we were able to obtain the sockets */
/*select socket and close other socket*/ fromlen = sizeof(from); connsock = accept(selectedsock, &from, fromlen); /* handle accept error */ ammountread = recv(connsock, buffer, sizeof(buffer), 0); /* handle recv error */ send(connsock, buffer, ammountread, 0); /* handle send error */ closesocket(connsock); }
3.6 Concurrent server
Servers need to handle a new connection request while processing previous requests.
Most TCP servers are designed to be concurrent.
When a new connection request arrives at a server, the server accepts and invokes a new process to handle the new client.
Appendix IPv6 Support
Linux: Kernel 2.4.x
http://cosmos.kaist.ac.kr/~shlee/ipv6/doc/ipv6linux.txt
Windows XP, windows 2000, windows 2003
http://www.microsoft.com/windowsserver2003/technologies /ipv6/default.mspx