Vous êtes sur la page 1sur 27

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

Vous aimerez peut-être aussi