0% found this document useful (0 votes)
294 views93 pages

03 - WinSock Programming - Wechen PDF

The sockaddr structure is used to name the socket by specifying the protocol family, port number and IP address. The bind() function binds the socket to a local port and IP address using this structure. 2004/12/24 Speaker: Whai-En Chen 17 LAB 117 & VoIP LAB Associate Sockets „ Server: - Open a socket - Bind the socket to a port - Listen for incoming connections - Accept connections from clients „ Client: - Open a socket - Connect to server's address and port „ connect( ) associates the client socket with the server socket 2004/12/24 Speaker

Uploaded by

js590
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
294 views93 pages

03 - WinSock Programming - Wechen PDF

The sockaddr structure is used to name the socket by specifying the protocol family, port number and IP address. The bind() function binds the socket to a local port and IP address using this structure. 2004/12/24 Speaker: Whai-En Chen 17 LAB 117 & VoIP LAB Associate Sockets „ Server: - Open a socket - Bind the socket to a port - Listen for incoming connections - Accept connections from clients „ Client: - Open a socket - Connect to server's address and port „ connect( ) associates the client socket with the server socket 2004/12/24 Speaker

Uploaded by

js590
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 93

Windows Socket Programming &

IPv6 Translation Middleware

Dr. Whai-En Chen

VoIP and IPv6 Laboratory


Research Assistant Professor
Dept. of Computer Science and Information Engineering
National Chiao Tung University
Email: [email protected]
TEL: +886-3-5731924
LAB 117
&
VoIP LAB

Outline
„ Introduction to Socket/WinSock Programming
„ IPv4 WinSock Programming
„ IPv6 WinSock Programming
„ IPv6 Translation Middleware- Socket-layer Translator
„ Conclusions

2004/12/24 Speaker: Whai-En Chen 2


LAB 117
&
VoIP LAB

Introduction
„ What is Windows Sockets?
- An Open Interface for Network Programming under Microsoft
Windows
„ What are its Benefits?
- an open standard
- source code portability
- support dynamic linking
„ What is its Future?
- WinSock 2

2004/12/24 Speaker: Whai-En Chen 3


LAB 117
&
VoIP LAB

Windows Sockets

2004/12/24 Speaker: Whai-En Chen 4


LAB 117
&
VoIP LAB

BSD Socket APIs


accept() bind() closesocket() connect()
getpeername() getsockname() getsockopt() htonl()
htons() inet_addr() inet_ntoa() ioctlsocket()
listen() ntohl() ntohs() recv()
recvfrom() select() send() sendto()
setsockopt() shutdown() socket()
gethostname()
gethostbyaddr() gethostbyname()
getprotobyname() getprotobynumber()
getservbyname() getservbyport()

2004/12/24 Speaker: Whai-En Chen 5


LAB 117
&
VoIP LAB

Winsock APIs

WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()

2004/12/24 Speaker: Whai-En Chen 6


LAB 117
&
VoIP LAB

Windows Sockets 2.0 Architecture


WinSock 2 WinSock 2
Application Application

WinSock 2 API

Transport Functions Name Space Functions


The WinSock 2 DLL
WS2_32.DLL (32 bit)

WinSock 2 WinSock 2
Transport SPI Name Space SPI

Transport Transport Name Space Name Space


Service Service Service Service
Provider Provider Provider Provider

2004/12/24 Speaker: Whai-En Chen 7


LAB 117
&
VoIP LAB

Compatibility of Winsock
WinSock 2 WinSock 1.1
Application Application

WinSock 1.1 API

WINSOCK.DLL (16 bit)


WSOCK32.DLL (32 bit)

WinSock 2 API

WS2_32.DLL (32 bit)

WinSock 2 SPI

TCP/IP TCP/IP-based
Transport Namespace
Service Provider Service Provider
e.g. DNS

2004/12/24 Speaker: Whai-En Chen 8


LAB 117
&
VoIP LAB

Winsock and OSI Model

2004/12/24 Speaker: Whai-En Chen 9


LAB 117
&
VoIP LAB

Client/Server Model
„ Client-Server Model
„ Client and Server Association
- protocol ( same for both Clint and server sockets )
- client IP address
- client port number
- server IP address
- server port number

2004/12/24 Speaker: Whai-En Chen 10


LAB 117
&
VoIP LAB

Client/Server Programming(1)
TCP Client TCP Server

socket socket bind

connect accept listen

data
send recv

data
recv send

close/ close/
closesocket closesocket

2004/12/24 Speaker: Whai-En Chen 11


LAB 117
&
VoIP LAB

Client/Server Programming(2)
UDP Client UDP Server

socket socket

bind

data
sendto recvfrom

data
recvfrom sendto

close/ close/
closesocket closesocket

2004/12/24 Speaker: Whai-En Chen 12


IPv4 Socket Programming
LAB 117
&
VoIP LAB

Network Program Sketch


„ Open a socket
„ Name the socket
„ Associate with another socket
„ Send and receive between sockets
„ Close the socket

2004/12/24 Speaker: Whai-En Chen 14


LAB 117
&
VoIP LAB

Open a Socket

2004/12/24 Speaker: Whai-En Chen 15


LAB 117
&
VoIP LAB

Name the Socket


„ What’s in a Socket Name?
- protocol, port number and IP address

„ bind( )
int PASCAL FAR bind ( SOCKET s, /*an unbound socket */
struct sockaddr FAR *addr, /*local port and IP addr */
int namelen); /*addr structure length*/
S: socket handle
addr : pointer to a socket address structure
(always a sockaddr_in data structure for
TCP/IP)
namelen: length of socket structure pointed to by addr
(always 4 for TCP/IP)

2004/12/24 Speaker: Whai-En Chen 16


LAB 117
&
VoIP LAB

Name the Socket


„ sockaddr Structure
struct stockaddr {
u_short sa_family; /*address family*/
char sa_data[14]; /*undefined*/
};
sa_family : address family
sa_data: address structure data area defined
according to address family value

2004/12/24 Speaker: Whai-En Chen 17


LAB 117
&
VoIP LAB

Name the Socket


„ sockaddr_in Structure
structure sockaddr_in {
short sin_family; /* address family (PF_INET) */
u_short sin_port; /* port (service) number */
struct in_addr sin_addr; /* IP address (32-bit) */
char sin_zero[8]; /*<unused filler>*/
};
sin_family : address family
sin_port : 16-bit port number in network order
sine_addr : 32-bit Internet address in network
order
2004/12/24 Speaker: Whai-En Chen 18
LAB 117
&
VoIP LAB

Associate with Another Socket


„ Protocol ( same for both client and server sockets)
„ client IP address
„ client port number
„ server IP address
„ server port number

2004/12/24 Speaker: Whai-En Chen 19


LAB 117
&
VoIP LAB

Associate with Another Socket

2004/12/24 Speaker: Whai-En Chen 20


LAB 117
&
VoIP LAB

Associate with Another Socket


„ How a Server Prepares for an Association
listen()
int PASCAL FAR listen ( SOCKET s, /* a named, unconnected
socket */
int backlog) ; /* pending connect queue
length */
s: socket handle to a named socket ( bind() called),
but not yet connected
backlog: length of the pending connection queue ( not the
same as the number of accepted connections)

2004/12/24 Speaker: Whai-En Chen 21


LAB 117
&
VoIP LAB

Associate with Another Socket


„ How a Client Initiate an Association
connect()
int PASCAL FAR connect (SOCKET s, /*an unconnected socket */
struct sockaddr FAR *addr, /*remote port and IP addr */
int namelen ); /* addr structure length */

s: socket handle
addr: pointer to socket address structure (always a
sockaddr_in structure for TCP/IP)
namelen: length of structure pointed to by addr (always 4
for TCP/IP)

2004/12/24 Speaker: Whai-En Chen 22


LAB 117
&
VoIP LAB

Associate with Another Socket


„ How a Server Completes an Association
accept()
SOCKET PASCAL FAR accept (SOCKET s, /*a listening socket*/
struct sockaddr FAR *addr, /*name of incoming
socket*/
int FAR *addrlen);

s: socket handle
addr: pointer to socket address structure ( always a
sockaddr_in structure for TCP/IP)
addrlen: length of socket structure that addr points to
( always 4 for TCP/IP)

2004/12/24 Speaker: Whai-En Chen 23


LAB 117
&
VoIP LAB

Send and Receiver between Sockets


„ Sending Data on a “Connected” Socket
send()
int PASCAL FAR send (SOCKET s, /*associated socket*/
const char FAR *buf, /*buffer with outgoing data*/
int len, /*bytes to send*/
int flags ); /*option flags*/

s: socket handle
buf: pointer to a buffer that contains application data to
send
len: length of data (in bytes) to send
flags: flags to affect the send ( MSG_OOB, MSG_DONTROUTE)

2004/12/24 Speaker: Whai-En Chen 24


LAB 117
&
VoIP LAB

Send and Receiver between Sockets


„ Sending Data on an “Unconnected” Socket
sendto()
int PASCAL FAR sendto (SOCKET s, /*a valid socket */
const char FAR *buf, /*buffer with outgoing data */
int len, /*bytes to send */
int flags, /*option flags */
struct sockaddr FAR *to, /*remote socket name */
int tolen ); /*length of sockaddr */
to: pointer to socket structure (always a sockaddr_in for
TCP/IP) that contains destination address and port
number ( socket name)
tolen: length of socket structure pointed to by to ( always 4
for TCP/IP)

2004/12/24 Speaker: Whai-En Chen 25


LAB 117
&
VoIP LAB

Send and Receiver between Sockets


„ Receiving Data
recv()
int PASCAL FAR recv (SOCKET s, /*associated socket*/
char FAR *buf, /*buffer with outgoing data*/
int len, /*bytes to send */
int flags ); /*option flags */
recvform()
int PASCAL FAR recvform (SOCKET s, /*a valid socket*/
char FAR *buf, /*buffer with outgoing data*/
int len, /*bytes to send */
int flags ); /*option flags */
struct sockaddr FAR *from, /*remote socket name */
int fromlen ); /*length of sockaddr */

2004/12/24 Speaker: Whai-En Chen 26


LAB 117
&
VoIP LAB

Send and Receiver between Sockets


s: socket handle
buf: pointer to a buffer that contains application data to
send
len: length of data (in bytes) to send
flags: flags to affect the send ( MSG_OOB,
MSG_DONTROUTE)
from: pointer to socket structure ( always a sockaddr_in for
TCP/IP) that contains source address and port
number ( socket name)
fromlen: length of socket structure pointed to by from ( always
4 for TCP/IP)

2004/12/24 Speaker: Whai-En Chen 27


LAB 117
&
VoIP LAB

Other Useful Socket Functions


„ Byte Ordering Functions
„ ntohs(), ntohl()
„ htons(), htonl()
„ Address Translation Functions
„ inet_addr()- 將字串轉成32位元的IP位址
„ inet_nota()- 將32位元的IP位址轉成字串
„ Name Resolution
„ gethostbyaddr()-利用 host 的位址來獲取該 host 的資料
„ gethostbyname()-利用 host 的名稱來獲取該 host 的資料
„ 傳回hostent的資料結構
„ WSAStartup() and WSACleanup()
2004/12/24 Speaker: Whai-En Chen 28
LAB 117
&
VoIP LAB

hostent 資料結構
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
}
„ 是一個linked-list

2004/12/24 Speaker: Whai-En Chen 29


LAB 117
&
VoIP LAB

Byte Ordering Function


Increasing memory address

Address A+1 Address A


Little-endian byte order: High-order byte low-order byte

MSB 16bit value LSB

Big-endian byte order: High-order byte low-order byte


Address A Address A+1

Increasing memory address

2004/12/24 Speaker: Whai-En Chen 30


LAB 117
&
VoIP LAB

IPv4 Example for


Daytime Server (Connection-oriented)
int main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd =
socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(13);
/* daytime server */

bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

2004/12/24 Speaker: Whai-En Chen 31


LAB 117
&
VoIP LAB

IPv4 Example for


Daytime Server (Connection-oriented)

listen(listenfd, LISTENQ);

for ( ; ; ) {
connfd = accept(listenfd, (SA *) NULL, NULL);

ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff));

Close(connfd);
}
}

2004/12/24 Speaker: Whai-En Chen 32


LAB 117
&
VoIP LAB

IPv4 Example for


Daytime Client (Connection-oriented)
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
/* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);

2004/12/24 Speaker: Whai-En Chen 33


LAB 117
&
VoIP LAB

IPv4 Example for


Daytime Client (Connection-oriented)
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");

while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {


recvline[n] = 0;
/* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);
}

2004/12/24 Speaker: Whai-En Chen 34


IPv6 Socket Programming
LAB 117
&
VoIP LAB

提供轉換IPv4程式到IPv6之方法
„ 介紹IPv4與IPv6之長度不同
„ 介紹為何需要改變應用程式
„ 介紹不用轉換的Socket API
„ 介紹需要轉換的Socket API
„ 介紹需要轉換的資料結構

2004/12/24 Speaker: Whai-En Chen 36


LAB 117
&
VoIP LAB

IPv4/IPv6位址長度不同

„ 數字位址
„ IPv4, 32位元位址長度
„ IPv6, 128位元位址長度

32 bits
IPv4

IPv6
128 bits

2004/12/24 Speaker: Whai-En Chen 37


LAB 117
&
VoIP LAB

為何需要轉換應用程式

New Solutions for Applications

V4/v6 Protocol-independent
IPv4 AP IPv6 AP Application

TCP/UDP TCP/UDPv6 TCP/UDP TCP/UDPv6

IPv4 IPv6 IPv4 IPv6

Layer 1 and 2 Layer 1 and 2

2004/12/24 Speaker: Whai-En Chen 38


LAB 117
&
VoIP LAB

不需要轉換的Socket API (依序)


„ Server端的程式碼
„ socket open a socket
„ bind bind local address to the socket
„ listen listen on a port
„ accept wait for the connection
„ read/write if TCP
„ recvfrom/sendto if UDP
„ Client端的程式碼
„ socket open a socket
„ connect connect to a server
„ read/write if TCP
„ recvfrom/sendto if UDP

2004/12/24 Speaker: Whai-En Chen 39


LAB 117
&
VoIP LAB

轉換需要改變的部分
„ 與IP位址相關的Socket API與參數需要修改
„ 程式部分有運用到IP位址的部分
„ 位址轉換函式
„ 位址複製函式
„ 位址比較函式
„ 位址相關之記憶體指派與變數宣告

IPv4程式設計者的自訂的函式與變數也需要修改

2004/12/24 Speaker: Whai-En Chen 40


LAB 117
&
VoIP LAB

API與資料結構的轉換
„ Socket參數名稱轉換

IPv4 IPv6

AF_INET AF_INET6

PF_INET PF_INET6

IN_ADDR_ANY inaddr6_any

2004/12/24 Speaker: Whai-En Chen 41


LAB 117
&
VoIP LAB

API與資料結構的轉換
„ 資料結構轉換

IPv4 IPv6
in_addr in6_addr

sockaddr
sockaddr_in6

sockaddr_in sockaddr_in6

2004/12/24 Speaker: Whai-En Chen 42


LAB 117
&
VoIP LAB

IPv4 Socket Address Structure


Struct in_addr{
in_addr_t s_addr; /*32bit IPv4 address*/
}; /*network byte ordered*/

struct sockaddr_in {
uint8_t sin_len; /* length of structure(16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16bit TCP or UDP port number */
/*network byte ordered*/
struct in_addr sin_addr; /* 32bit IPv4 address */
/*network byte ordered*/
char sin_zero[8]; /* unused */
}; /* included in <netinet/in.h> */

2004/12/24 Speaker: Whai-En Chen 43


LAB 117
&
VoIP LAB

IPv6 Socket Address Structure


Struct in6_addr{
uint8_t s6_addr[16]; /*128bit IPv6 address*/
}; /*network byte ordered*/
#define SIN6_LEN /* required for compile-time tests */
struct sockaddr_in6 {
uint8_t sin6_len; /* length of structure(24) */
sa_family_t sin6_family; /* AF_INET6*/
in_port_t sin6_port; /* Transport layer port# */
/*network byte ordered*/
uint32_t sin6_flowinfo; /* priority & flow label */
/*network byte ordered*/
struct in6_addr sin6_addr; /* IPv6 address */
/*network byte ordered*/
}; /* included in <netinet/in.h> */

2004/12/24 Speaker: Whai-En Chen 44


LAB 117
&
VoIP LAB

API與資料結構的轉換
„ 資料結構參數轉換

IPv4 IPv6

sin_len sin6_len

sin_family sin6_family

sin_port sin6_port

sin_addr sin6_addr

s_addr s6_addr

2004/12/24 Speaker: Whai-En Chen 45


LAB 117
&
VoIP LAB

API與資料結構的轉換
„ 函式轉換
IPv4 IPv6

inet_aton()
Name-to_address inet_addr() inet_pton()
Functions

inet_ntoa() inet_ntop()

getipnodebyname()
Address conversion gethostbyname() getipnodebyaddr()
Functions gethostbyaddr() getnameinfo()
getaddrinfo()

2004/12/24 Speaker: Whai-En Chen 46


LAB 117
&
VoIP LAB

Data Structure Comparison

„ AF independent „ AF independent
„ struct sockaddr „ struct sockaddr_storage
„ IPv4 dependent „ IPv6 dependent
„ struct in_addr „ struct in6_addr
„ struct sockaddr_in „ struct sockaddr_in6
„ Name resolving „ Name resolving
„ struct hostent „ struct addrinfo

IPv4 IPv6

2004/12/24 Speaker: Whai-En Chen 47


LAB 117
&
VoIP LAB

Definitions and Function Calls


„ Address Family&Protocol Family
„ AF_INET6 & PF_INET6 for IPv6
„ No changes to transport socket APIs
„ socket(), connect(), bind()……
„ Name resolving
„ AF dependent functions are obsolete
„ New AF independent functions
„ gethostbyname() and gethostbyaddr()- IPv4-only
„ getaddrinfo() and getnameinfo()- IPv4 & IPv6

2004/12/24 Speaker: Whai-En Chen 48


LAB 117
&
VoIP LAB

getaddrinfo() & getnameinfo()


„ Convert strings storing address and service into sockaddr
structure
„ getaddrinfo(“www.kame.net”,”www”,&hint,&res);
„ Options are specified in hint
„ hint is an addrinfo structure
„ Results are returned as a linked-list, each list node contains a
sockaddr structure
„ freeaddrinfo() to free returned linked-list
„ freeaddrinfo(res);
„ getnameinfo() converts from sockaddr into strings storing
address and service
„ getnameinfo(sa,name,sizeof(name),srv,sizeof(srv),0);

2004/12/24 Speaker: Whai-En Chen 49


LAB 117
&
VoIP LAB

Introduction to Checkv4.exe
„ Provided by Microsoft
„ Identifies potential problems in codes and makes
recommendations
„ Identifies most trivial problems
„ Successfully checks presence of IPv4 specified code. e.g.
gethostbyname(), struct sockaddr_in, and so on.
„ Gives some false alert
„ Identifies parameters in comment
„ Results from Checkv4.exe
„ About 200 lines for CCL/ITRI SkinUA

2004/12/24 Speaker: Whai-En Chen 50


LAB 117
&
VoIP LAB

Checkv4.exe (Partial Results)

2004/12/24 Speaker: Whai-En Chen 51


LAB 117
&
VoIP LAB

Comparison of socket address structure


LAB 117
&
VoIP LAB

Socket address structure pass.

bind, connect, sendto accept, recvfrom, getsockname,


getpeername
2004/12/24 Speaker: Whai-En Chen 53
LAB 117
&
VoIP LAB

2004/12/24 Speaker: Whai-En Chen 54


LAB 117
&
VoIP LAB

NTPO&CCL SIP User Agent (UA)


„ SIP-based VoIP phone running on Windows
„ Support H.263 Video codec
„ Support G.711u/G.711a/G.723/G.729 Audio codec
„ Support registration
„ Support authentication

2004/12/24 Speaker: Whai-En Chen 55


LAB 117
&
VoIP LAB

Structure of SIP UA
UI

UAProfile CallManager MediaManager

UACore cclRTP Codec

WaveIO
SDP sipTx

SIP RTP

Transport
2004/12/24 Speaker: Whai-En Chen 56
LAB 117

Component Relationship of &


VoIP LAB

CallManager

UI

Function Call Windows Event

CallManager MediaManager
Function Call

Function Call Callback Function

UACore

2004/12/24 Speaker: Whai-En Chen 57


LAB 117
&
VoIP LAB

GUI Problem
„ IP Address control
„ Is IPv4 specified
„ Do not accept domain name
„ Use Edit control instead

2004/12/24 Speaker: Whai-En Chen 58


LAB 117
&
VoIP LAB

Get Local Address (1/2)


„ Old method: gethostbyname()
„ Gethostbyname() on local hostname
„ Does getaddrinfo() on local hostname works?
„ Not works on Windows XP
„ Works on Windows 2003

2004/12/24 Speaker: Whai-En Chen 59


LAB 117
&
VoIP LAB

Get Local Address (2 of 2)


„ Make use of IPHelper functions
„ Presented in Windows from Windows 98
„ A Windows-only solution
„ Works on both windows XP and 2003
„ Function name: GetAdaptersAddresses()

2004/12/24 Speaker: Whai-En Chen 60


LAB 117
&
VoIP LAB

Parsing URI with IPv6


„ IPv6 address in URI
„ sip:wechen@[3ffe:1345:5643::3]:5060
„ Some parser assume semicolon will be used only to separate IP
and Port
„ Modify parsing algorithm to deal with IPv6 address.
„ URI in SIP header may contains IPv6 address
„ INVITE sip:wechen@[2001:238:f82:66::33]:5060
„ IP6 addrtype & IPv6 address in SDP
„ c=IN IP6 FE80:60::2

2004/12/24 Speaker: Whai-En Chen 61


LAB 117
&
VoIP LAB

Goal of Porting SIP UA to IPv6


„ Provide IPv6 communication to Users
(a long-term solution)
„ SIP UA should accept SIP URI that contains IPv6
literal address (specified in RFC 3261)
„ SIP UA should correctly handle IPv6 addresses in
SIP/SDP header fields
„ SIP UA should operate with other IPv6 SIP UAs
(KPhone and LinPhone) and SIP servers (IPtel and
Partysip).

2004/12/24 Speaker: Whai-En Chen 62


LAB 117
&
VoIP LAB

Modifications for SIP User Agent


„ Auto IPv4/IPv6 negotiation requires modification in
listening thread part and rewrite working flow of
calling
„ The IP version is the same as the IP address that user choose
„ SIP UA will use either IPv4 or IPv6 at the same time.
„ Lower part in protocol stack should check an extra parameter
that specifies address family

2004/12/24 Speaker: Whai-En Chen 63


LAB 117

Modifications for SIP User Agent &


VoIP LAB

(cont.)
„ IPv6 address Literal format has scope-id
„ E.g. fe80::201:2ff:fe85:37ed%3
„ Used by linked-local address
„ Identify the same address on different interface
„ Scope-id must be specified when connecting to sites
using link-local address
„ An extra parameter in data structure to keep this

2004/12/24 Speaker: Whai-En Chen 64


LAB 117

Modifications for SIP User Agent &


VoIP LAB

(cont.)
„ SIP URI may contain IPv6 address
„ E.g. sip:wechen@[2001:238:f82:6::2]:5060
„ Rewrite parser to ensure correctly dealing with colon
„ Since IPv6 address are longer than IPv4 address, GUI
components related to address should be modified
„ Avoid using IPAddressControl that supports IPv4
address only

2004/12/24 Speaker: Whai-En Chen 65


LAB 117
&
VoIP LAB

Results
„ Changes 500+ out of 100,000+ lines in 150 files
„ About 300 lines are not identified by checkv4.exe
„ SIP UA supports
„ IPv4 or IPv6 communication
„ IPv6 address in SIP URI
„ IPv6 address in GUI and form
„ Modifications in SIP UA
„ Transport – handle different IP versions
„ GUI – handle IPv6 address
„ CallManager – URI parsing/generating

2004/12/24 Speaker: Whai-En Chen 66


LAB 117
&
VoIP LAB

Modification Summary

Module name Modified files

UACore 5

sipTX 4

sip 5

sdp 1

rtp 6

transport 6

cclRTP 2

MediaManager 4

UI 4
Total: 39 files
UAProfile 2

2004/12/24 Speaker: Whai-En Chen 67


LAB 117
&
VoIP LAB

啟動SIPv6 User Agent

2
Click right botton
1 Double-click

4 3
Next Page

2004/12/24 Speaker: Whai-En Chen 68


LAB 117
&
VoIP LAB

設定SIPv6 User Agent的IPv6位址

1. 選擇「User Settings」分頁
1
2. 在「User IP Address」選項中,
選擇Global Unicast IPv6 Address
(如:2001:238:f88:131:2e0:18ff:feea:f782)
3. 如果要跨越IPv4網路,則需要選擇
6to4位址(Prefix是2002::/16)

3
Next Page

2004/12/24 Speaker: Whai-En Chen 69


LAB 117
&
VoIP LAB

設定SIPv6 User Agent的伺服器

1. 選擇「Server Settings」分頁
1
2. 取消「Use Proxy」選項
2 3. 取消「Registration」;若是有IPv6
SIP伺服器,則可以選取選項,並填入
伺服器的IPv6位址

4
Next Page

2004/12/24 Speaker: Whai-En Chen 70


LAB 117

設定SIPv6 User Agent的Codec參 &


VoIP LAB

1. 選擇「Codec Settings」分頁
1
2. 將要用的Codec放入「Active
Codecs」選項中
3. 選取「Use Video」,若不需要
2
影像則可以取消此選項
4. 按下「確定」按鈕,完成設定

4
Next Page
3

2004/12/24 Speaker: Whai-En Chen 71


LAB 117
&
VoIP LAB

開始撥號 (輸入SIP URI)


1. 按下圖中按鈕
2. 可以直接輸入SIP URI (如:SIP:7221@3ffe:3600:1::1)
3. 或是可以按下「List」按鈕,從選單中選取
4-6. 按下「Load」按鈕,選取SIP URI,按下「OK」完成

1
4
5
7
Next Page
6

2 3

2004/12/24 Speaker: Whai-En Chen 72


LAB 117
&
VoIP LAB

撥號與接聽

發話方 受話方

1. 按下「Dial」按鈕,開始撥號
2. 受話方案下圖中電話筒圖案即可接聽
2004/12/24 Speaker: Whai-En Chen 73
計畫 LAB 117
&
VoIP LAB

展示項目- SIPv6 User Agent (UA) 移植成果

4.通訊影像
Using
UsingIPv6
IPv6Addresses
Addresses

1.設定 2.撥號 圖例:


SIP Signaling (IPv6)
SIP Signaling (Tunnel)
4.通訊影像
3.3 INVITE
3.1 INVITE
3.4 200 OK SIPv6 UA
SIPv6 UA 3.6 200 OK Tunneling
3.2 INVITE
3.7 ACK 3.5 200 OK 3.9 ACK
4. RTP 3.8 ACK 4. RTP

IPv6 Network Dual-stack 4. RTP Dual-stack IPv6 Network


(Showroom) Router Router (NCTU VoIP Lab)
Internet (IPv4)
2004/12/24 Speaker: Whai-En Chen 74
p
LAB 117

SIP Messages over &


VoIP LAB

IPv6

IPv6 address

2004/12/24 Speaker: Whai-En Chen 75


p
LAB 117

RTP Stream over &


VoIP LAB

IPv6

IPv6 address

2004/12/24 Speaker: Whai-En Chen 76


LAB 117
&
VoIP LAB

Interoperability Testing
„ Testing with 2 Linux SIP-based phone
„ Kphone 3.2 with IPv6 (patched by iptel)
„ Linphone 0.11.3 (claimed as IPv6 enabled)
„ Environment
„ Windows XP SP1
„ Redhat linux 9.0
„ Partysip IPv6 SIP proxy
„ Iptel IPv6-enabled SIP server

2004/12/24 Speaker: Whai-En Chen 77


LAB 117
&
VoIP LAB

Interoperability Testing Results

„ To IPv6 SIP proxy

Item Result
Register on iptel Succeed
Register on partysip Succeed
Call UA through partysip Succeed
proxy server

2004/12/24 Speaker: Whai-En Chen 78


LAB 117
&
VoIP LAB

Interoperability Testing Results

„ To IPv6 SIP UA
To
From Kphone Linphone SkinUA

OK SIP ok SIP ok
KPhone

SIP ok OK SIP ok
Linphone

OK SIP ok OK

SkinUA

• Linphone & KPhone can not accept URI containing IPv6 Literal address in URI.

2004/12/24 Speaker: Whai-En Chen 79


IPv6 Translation Mechanism-
Bump-In-the-API
LAB 117
&
VoIP LAB

設計主機端轉換之中介軟體
„ 可是要將應用程式升級成IPv6會有以下問題
„ 需要改用新的 API
„ 需要改用新的 Data structure
„ 以SIP-based VoIP User Agent為例
„ 約有200行Socket API、資料結構需要轉換
„ 共約有600行位址相關函式、變數、記憶體指派需要修改
„ 短期內將程式升級IPv6不容易
„ 需要改的函式、變數需要追蹤修訂
„ 程式版本升級時,亦需隨之修訂
„ 提出一個轉換v4/v6的中介軟體,以 BIA為基礎,
設計應用層轉換機制
2004/12/24 Speaker: Whai-En Chen 81
LAB 117
&
VoIP LAB

軟硬體來源與執行平台
„ BIA轉換器元件
„ Function Mapper
„ Name Resolver
„ Address Mapper
„ ALG Manager
„ FTP-ALG
„ BIA轉換器的開發平台如下
開發平台
„ 作業系統: Windows XP SP1
„ 中央處理器: Intel Celeron 2GHz
„ 記憶體: 128 MB
„ 硬碟: 20GB
„ 編譯程式: Microsoft Visual C++ 6.0
„ 開發函式庫: Microsoft Platform SDK February 2003
„ BIA可以執行於微軟Windows XP/2003之上
XP/2003

2004/12/24 Speaker: Whai-En Chen 82


LAB 117
&
VoIP LAB

Name Resolving:
Translate IPv6 address to IPv4 address

2004/12/24 Speaker: Whai-En Chen 83


LAB 117
&
VoIP LAB

Socket-layer Translator Result

2004/12/24 Speaker: Whai-En Chen 84


LAB 117
&
VoIP LAB

Using IPv4 to Browse


Without Socket-layer Translator

2004/12/24 Speaker: Whai-En Chen 85


LAB 117
&
VoIP LAB

Conclusions
„ In this course, you can learn the following techniques
„ IPv4 Windows Socket Programming
„ IPv6 Windows Socket Programming
„ IPv4/IPv6 Domain Name Resolution
„ You can try to do following advanced topics.
„ Writing IPv4/IPv6 compatible programs
„ Porting IPv4 applications to IPv6 version
„ Writing ALG on Socket-layer Translator
„ Writing IPv6 Test tools on SIPv6 Analyzer

2004/12/24 Speaker: Whai-En Chen 86


LAB 117
&
VoIP LAB

References
„ Microsoft Platform SDK
„ MSDN Library
„ VC++ 6.0

2004/12/24 Speaker: Whai-En Chen 87


LAB 117
&
VoIP LAB

References
[1] RFC- 2766 Network Address Translation - Protocol Translation,G.
Tsirtsis、P. Srisuresh,2000/2
[2] RFC-2765 Stateless IP/ICMP Translator (SIIT),Nordmark, E.,2000/2
[3] RFC-2767 Bump-In-the-Stack,K. Tsuchiya、H. Higuchi、Y.
Atarashi,2000/2, [4] RFC-3338 Bump-In-the-API,S. Lee、M-K.
Shin、Y-J. Kim、E. Nordmark、A. Durand,2002/10
[5] IPv6 Guide for Windows Sockets Applications,MSDN Library,
2003/2, http://msdn.microsoft.com/library/en-
us/winsock/winsock/ipv6_guide_for_windows_sockets_applications_2.a
sp?frame=true
[6] How to upgrade WinSock application to support IPv6,Makoto
Ookawa,2003/7,
http://www.ipv6style.jp/en/apps/20030711/20030711_p.shtml
[7] RFC-2893 Transition Mechanisms for IPv6 Hosts and Routers,R.
Gilligan、 E. Nordmark,2000/8
[8] Hitachi Toolnet6, http://www.hitachi.co.jp/Prod/comp/network/pexv6-
e.htm
[9] IPv6解析,謝佳男、朱永正、陳懷恩譯,台灣歐萊禮,ISBN:986-
7794-11-7

2004/12/24 Speaker: Whai-En Chen 88


Appendix
LAB 117
&
VoIP LAB

IPv4 Header

2004/12/24 Speaker: Whai-En Chen 90


LAB 117
&
VoIP LAB
IPv6 Header

2004/12/24 Speaker: Whai-En Chen 91


LAB 117
&
VoIP LAB

IPv4
Address

2004/12/24 Speaker: Whai-En Chen 92


LAB 117
&
VoIP LAB

IPv6
Address

2004/12/24 Speaker: Whai-En Chen 93

You might also like