Internet 网络编程原理网络编程原理

来源:百度文库 编辑:神马文学网 时间:2024/06/03 13:26:47
Internet 网络编程原理网络编程原理2008年06月23日 星期一 下午 01:11第二章第二章InternetInternet 网络编程原理网络编程原理
--Socket Socket 套接口套接口
1.1.socket socket 简介简介
2.2.TCP/UDPTCP/UDP通信原理通信原理
3.3.端口号端口号
4.4.socketsocket基本函数介绍基本函数介绍
5.5.socket socket 编程辅助函数及数据结构编程辅助函数及数据结构
6. 6. Winsock APIWinsock API
2.1 2.1 socket socket 简介简介
2007-3-263
2.1.1 2.1.1 socket socket --套接口定义套接口定义
socketssockets——套接口,套接口,原为加州大学原为加州大学BerkeleyBerkeley分分
校为校为UNIXUNIX操作系统(操作系统(19831983年,年,4.2 4.2 BSDBSD))所设所设
计的一套网络通信接口.规定了网络应用程序与计的一套网络通信接口.规定了网络应用程序与
internetinternet协议族之间的连接方式,现已成为事实协议族之间的连接方式,现已成为事实
上的工业标准.上的工业标准.
源源IPIP,,源端口号,目的源端口号,目的IPIP,,目的端口号两对标识目的端口号两对标识
可形成应用程序间通信通道,称为套接口四元组可形成应用程序间通信通道,称为套接口四元组
((socket pairsocket pair))..
2007-3-264
2.1.2 2.1.2 socket API socket API 简介简介
2020世纪世纪9090年代,年代,由由Sun Microsystems, Microsoft, Sun Microsystems, Microsoft,
JSBJSB等公司,共同制定一套标准,即等公司,共同制定一套标准,即Windows Windows
SocketSocket规范,简称规范,简称WinsockWinsock..
由一组函数组成,一般用于连接应用层(由一组函数组成,一般用于连接应用层(ISOISO上上
三层)和传输层,传输层可为三层)和传输层,传输层可为TCPTCP或或UDPUDP..但通但通
过过SocketSocket,,上层应用程序也可以绕过传输层直接上层应用程序也可以绕过传输层直接
与网络层(与网络层(IPIP层)甚至数据链路层通信.层)甚至数据链路层通信.
WinSock APIWinSock API——Microsoft Microsoft 为为WindowsWindows应用设计应用设计
的一套的一套Socket Socket 函数.不同的程序语言由不同的实函数.不同的程序语言由不同的实
现.如现.如C, C++, Visual C++, Delphi, Visual Basic, C, C++, Visual C++, Delphi, Visual Basic,
Java, Visual J++, C++ Builder, Java, Visual J++, C++ Builder, JbuilderJbuilder…………
2.2 2.2 TCP/UDP TCP/UDP 通信原理通信原理
2007-3-266
2.2.1 2.2.1 TCP TCP 通信原理通信原理
TCP TCP --面向连接的(虚连接),端到端的可靠的面向连接的(虚连接),端到端的可靠的
数据流传递协议数据流传递协议
用用""传输确认传输确认"",,""拥塞控制拥塞控制"",,""故障重传故障重传""""超时超时
重传重传""的方法保证数据段的可靠传输的方法保证数据段的可靠传输
((Positive Acknowledgement with retransmissionPositive Acknowledgement with retransmission))
通过通过""三次握手三次握手""建立建立""端到端端到端""的双向连接的双向连接
--主叫端发出建立连接的请求,主叫端发出建立连接的请求,
--被叫端回答并提出连接请求及下一个数据包的序号被叫端回答并提出连接请求及下一个数据包的序号
--主叫端回答并提出下一个数据包的序号主叫端回答并提出下一个数据包的序号
--被叫端回答被叫端回答
2007-3-267
2.2.2 2.2.2 TCPTCP数据包结构数据包结构
源端口源端口((Source Port) 16Source Port) 16--bitsbits目的端口目的端口((Destination Port) 16Destination Port) 16--bitsbits
序列号序列号((Sequence NumberSequence Number))32 bits32 bits
确认号确认号((AcknowledgementAcknowledgement))32 bits32 bits
头长度头长度
4 4 bitsbits
保留保留
6 6 bitsbits
UU
RR
GG
AA
CC
KK
PP
SS
HH
RR
SS
TT
SS
YY
NN
FF
II
NN
窗口大小窗口大小( ( Windows Size)Windows Size)
16 bits16 bits
TCP TCP 校验和(校验和(TCP Checksum) 16 bitsTCP Checksum) 16 bitsTCP TCP 紧急指针紧急指针16 16 bitsbits
选项选项填充填充
数据数据
015 1631
TCPTCP
包头包头
2020字节字节
端口号:端口号:00——1024 1024 系统保留,系统保留,10251025--65535 65535 用户自定义用户自定义
2007-3-268
2.2.3 2.2.3 TCPTCP的连接(的连接(11))
三路握手三路握手((ThreeThree--way Handshakingway Handshaking))
--服务器必须准备好接受外来的连接,这通过调服务器必须准备好接受外来的连接,这通过调
用用socketsocket,,bindbind和和listenlisten函数来完成,称为被动函数来完成,称为被动
打开(打开(passive openpassive open))..
--客户通过调用客户通过调用connetconnet进行主动打开(进行主动打开(active active
openopen))..这这引起客户机引起客户机TCPTCP向服务器发送一个向服务器发送一个
SYNSYN分组(表示同步),它告诉服务器客户将分组(表示同步),它告诉服务器客户将
在连接中发送的数据的初始序列号.一般情况在连接中发送的数据的初始序列号.一般情况
下下SYNSYN分节不携带数据,它只含有一个分节不携带数据,它只含有一个IPIP头部,头部,
一个一个TCPTCP头部及可能有的头部及可能有的TCPTCP选项.选项.
2007-3-269
2.2.3 2.2.3 TCPTCP的连接(的连接(22))
三路握手三路握手((ThreeThree--way Handshakingway Handshaking))
--服务器必须确认客户机的服务器必须确认客户机的SYNSYN,,同时自己同时自己
也得发送一个也得发送一个SYNSYN分组给客户机,它含有分组给客户机,它含有
服务器将在同一连接中发送的数据的初始服务器将在同一连接中发送的数据的初始
序列号.服务器以单个分组向客户机发送序列号.服务器以单个分组向客户机发送
SYNSYN和对客户机和对客户机SYNSYN的的ACKACK..
--客户机必须确认服务器客户机必须确认服务器的的SYNSYN..
Why 3Why 3路握手 双向连接的要求!路握手 双向连接的要求!
2007-3-2610
2.2.4 2.2.4 TCPTCP建立连接过程建立连接过程
Host2Host2((被动等待,被动等待,
服务器端)服务器端)
Host1Host1((主动发起连接,主动发起连接,
客户机端)客户机端)
网络报文网络报文
发送发送SYN SYN seqseq=x=x
接收接收SYN +ACKSYN +ACK报报
文段文段
发送发送ACK y+1ACK y+1
接收接收SYN SYN 报文段报文段
发送发送SYN SYN seqseq=y, =y,
ACK x+1ACK x+1
接收接收ACKACK报文段报文段
1.确保双方做好传输数据的准备(且知道对方也做好了准备)
2.使用序号字段和确认字段协商双方的数据流的序号
2007-3-2611
2.2.5 2.2.5 TCPTCP的连接图示的连接图示
SYN+ x
SYN+ySYN+y,,ackackx+1x+1
AckAcky+1y+1
客户机客户机
(主动打开)(主动打开)
服务器服务器
Socket Socket
ConnectConnect
((阻塞)阻塞)
Connect Connect 返回返回
Socket, bind, Socket, bind,
listen accept (listen accept (阻塞阻塞))
Accept Accept 返回返回
read(read(阻塞)阻塞)
2007-3-2612
2.2.6 2.2.6 socket socket 工作原理工作原理
((面向连接的数据通信)面向连接的数据通信)
clientclient
socket( )socket( )
connect( )connect( )
send( )send( )
recvrecv( )( )
close( )close( )
ServerServer
socket( )socket( )
bind( )bind( )
listen( )listen( )
recvrecv( )( )
accept( )accept( )
send( )send( )
close( )close( )
阻塞,等待阻塞,等待
客户连接客户连接
处理服务要求处理服务要求阻塞,等待服务器数据到达阻塞,等待服务器数据到达
三次握手建立连接三次握手建立连接阻塞,等待阻塞,等待
三次握手连三次握手连
接完成接完成
2007-3-2613
面向连接的通信详解(面向连接的通信详解(11))
应用程序应用程序
①①socketsocket
TCPTCP
(80,*) (80,*) ②②bindbind
③③listenlisten
IPIP
服务器服务器
服务器端初始化服务器端初始化
①①建立应用程序和建立应用程序和TCPTCP协议间的协议间的
通道(数据结构和缓冲区)通道(数据结构和缓冲区)
②②指定端口号(指定端口号(IPIP地址)地址)
③③开始接受来自用户机的请求开始接受来自用户机的请求
2007-3-2614
面向连接的通信详解(面向连接的通信详解(22))
客户机端初始化客户机端初始化
①①建立应用程序和建立应用程序和TCPTCP协议间的通道协议间的通道
②②与服务器建立连接与服务器建立连接
③③向服务器发送请求向服务器发送请求④④接受来自服务器的应答接受来自服务器的应答
应用程序应用程序
①①socketsocket
TCPTCP
(2000,80) (2000,80) ②②connectconnect
IPIP
客户机客户机应用程序应用程序①①acceptaccept
TCPTCP
(80,*) (80,2000)(80,*) (80,2000)
IPIP
服务器服务器
服务器端服务器端
①在接收队列中建立一①在接收队列中建立一
个连接,形成个连接,形成socketsocket
④④
③③
2007-3-2615
面向连接的通信详解(面向连接的通信详解(33))
客户机端客户机端
③③向服务器发送请求向服务器发送请求
④④接受来自服务器的应答接受来自服务器的应答
应用程序应用程序
③③send send ④④readread
TCPTCP
(2000,80) (2000,80)
IPIP
客户机客户机应用程序应用程序
⑤⑤send send ⑥⑥recv recv
TCPTCP
(80,*) (80,2000)(80,*) (80,2000)
IPIP
服务器服务器
服务器端服务器端
⑤⑤向客户机发送应答向客户机发送应答
⑥⑥从客户机接受请求从客户机接受请求
2007-3-2616
2.2.7 2.2.7 TCPTCP的连接终止(的连接终止(11))
TCPTCP用三次交互建立一个连接,终止一个连接则需四用三次交互建立一个连接,终止一个连接则需四
个交互.个交互.
某个应用进程首先调用某个应用进程首先调用closeclose,,执行主动关闭(执行主动关闭(active active
closeclose))..该端该端TCPTCP发送一个发送一个FINFIN分组,表示数据发送完毕.分组,表示数据发送完毕.
接收到接收到FINFIN的另一端执行被动关闭(的另一端执行被动关闭(passive closepassive close))..这这
个个FINFIN由由TCPTCP确认,它的接收也作为文件结束符传递给接确认,它的接收也作为文件结束符传递给接
收方应用进程(放在已排队等候该应用进程接收的任何其收方应用进程(放在已排队等候该应用进程接收的任何其
他数据之后),因为他数据之后),因为FINFIN的接收意味着应用进程在相应连的接收意味着应用进程在相应连
接上再也接收不到额外数据.接上再也接收不到额外数据.
2007-3-2617
2.2.7 2.2.7 TCPTCP的连接终止(的连接终止(22))
TCPTCP用三个分节建立一个连接,终止一个连接则需四用三个分节建立一个连接,终止一个连接则需四
个分节.个分节.
一段时间后,接收到文件结束符的接收端应用进程将调一段时间后,接收到文件结束符的接收端应用进程将调
用用closeclose关闭它的套接口.这导致它的关闭它的套接口.这导致它的TCPTCP也发送一个也发送一个
FINFIN..
接收到这个接收到这个FINFIN的原发送方的原发送方TCPTCP((即执行主动关闭的一即执行主动关闭的一
端)对它进行确认.端)对它进行确认.
由于连接是双向的,所以每个方向都需要有一个由于连接是双向的,所以每个方向都需要有一个FINFIN
和一个和一个ACKACK,,所以一般需要四个环节.所以一般需要四个环节.
2007-3-2618
2.2.8 2.2.8 TCPTCP关闭连接过程关闭连接过程
host2host2host1host1
((应用程序关闭连接应用程序关闭连接))
发送发送FIN FIN seqseq=x=x接收接收FIN FIN 报文段报文段
发送发送ACK x+1ACK x+1
((通知本地应用程序)通知本地应用程序)
接收接收ACKACK报文段报文段
接收接收ACKACK报文段报文段
网络报文网络报文
((应用程序关闭连接应用程序关闭连接))
发送发送FIN FIN seqseq=y,=y,
ACK x+1ACK x+1接收接收FIN +ACKFIN +ACK
发送发送ACK y+1ACK y+1
1.1.改进的三次握手协议改进的三次握手协议
2.2.全双工通信必须两端连接都关闭全双工通信必须两端连接都关闭
2007-3-2619
2.2.9 2.2.9 TCPTCP的连接终止图示的连接终止图示
Read( )
返回Ack
(被动关闭)
(主动关闭)
Close( )FIN xFIN x
AckAck x+1
FIN y, FIN y, AckAckx+1x+1
AckAcky+1y+1
客户机服务器
Close( )
(主动关闭)
返回返回AckAck
彻底关闭彻底关闭接收接收AckAck
彻底关闭彻底关闭
Read( )
2007-3-2620
2.2.10 2.2.10 TCP TCP 状态转换图状态转换图
2007-3-2621
2.2.12 2.2.12 端口号端口号
WhyWhy
IPIP地址只能标识一台主机,对于更详细的应用程序进程地址只能标识一台主机,对于更详细的应用程序进程
间通信,特别对多任务系统中的多进程通信无能为力.间通信,特别对多任务系统中的多进程通信无能为力.
如:用如:用IEIE同时打开一个网站多个网页同时打开一个网站多个网页
一对多,数据量小的服务一对多,数据量小的服务((DNS, DHCPDNS, DHCP))
如何在给定的主机上识别多个目的地址,同时允许多个如何在给定的主机上识别多个目的地址,同时允许多个
应用程序在同一台计算机上运行,并独立地进行数据报应用程序在同一台计算机上运行,并独立地进行数据报
收发 收发
答案答案:使用:使用端口号端口号而不用进程作为数据报的最终目的地.而不用进程作为数据报的最终目的地.
为什么使用端口号而不用进程标识号为什么使用端口号而不用进程标识号
2007-3-2622
2.2.13 2.2.13 UDP UDP 通信原理通信原理
面向无连接的不可靠传输,使用面向无连接的不可靠传输,使用IPIP包传输数据,包传输数据,
不使用确认,不对到达的数据包进行排序,不不使用确认,不对到达的数据包进行排序,不
提供反馈信息控制主机间的信息流量提供反馈信息控制主机间的信息流量
端口号的应用增加了对给定主机上多个应用程端口号的应用增加了对给定主机上多个应用程
序进行区别的能力.序进行区别的能力.
可靠性问题:如:数据丢失,重复,乱序及连可靠性问题:如:数据丢失,重复,乱序及连
接失效等,由应用程序解决.接失效等,由应用程序解决.
局域网上使用效果好,但广域网则问题不少!局域网上使用效果好,但广域网则问题不少!
优点优点:传输快,实现简单,用于对可靠性要求:传输快,实现简单,用于对可靠性要求
不太高,但反应快的场合,如网管,不太高,但反应快的场合,如网管,DNSDNS
2007-3-2623
2.2.14 2.2.14 UDPUDP数据报结构数据报结构
UDPUDP源端口源端口UDPUDP目的端口目的端口UDPUDP源端口号源端口号UDPUDP目的端口号目的端口号
UDPUDP报文长度报文长度UDPUDP校验和校验和
数据数据
……
01631
UDPUDP头头UDP UDP 数据区数据区
IP IP 数据区数据区IPIP报头报头
IP IP 数据区数据区IPIP报头报头以太帧头以太帧头以太帧尾以太帧尾
2007-3-2624
2.2.17 2.2.17 socket socket 工作原理工作原理
(面向无连接的数据通信)(面向无连接的数据通信)
clientclient
socket( )socket( )
sendtosendto( )( )
recvfromrecvfrom( )( )
close( )close( )
ServerServer
socket( )socket( )
bind( )bind( )
recvfromrecvfrom( )( )阻塞,等待客户数据阻塞,等待客户数据
处理服务要求处理服务要求
数据(请求)数据(请求)
数据(应答)数据(应答)
sendtosendto( )( )
2.3 2.3 端口号端口号
2007-3-2626
2.3.1 2.3.1 端口号定义端口号定义
什么什么是是Port Number Port Number 端口号端口号
端口号,用以标识通信双方的应用程序的端口号,用以标识通信双方的应用程序的1616BitBit的标识的标识
由由IANAIANA((IInternet nternet AAuthorization of uthorization of NNumber umber
AAssignments ssignments ))因特网分配数值权威机构分配,因特网分配数值权威机构分配,
RFC1700RFC1700
ftp.ftp.isiisi..eduedu/in/in--notes/notes/ianaiana/assignments/port/assignments/port--numbersnumbers
为什么使用端口号 与为什么使用端口号 与IPIP地址的关系 地址的关系
IP IP --标识一台主机,标识一台主机,端口号端口号--标识主机上的一个应用标识主机上的一个应用
源源IPIP,,源端口号,目的源端口号,目的IPIP,,目的端口号两对标识目的端口号两对标识
可形成应用程序间通信通道,称为套接口四元组可形成应用程序间通信通道,称为套接口四元组
((socket pairsocket pair))..
2007-3-2627
2.3.2 2.3.2 端口号分类端口号分类
周知口(Well-known ports)-系统保留,超级用户使用
(UNIX).用于标识服务器应用进程,如, 21-FTP,
临时端口(Ephemeral ports) -客户机用,一般由系统自
动分配,客户机不太关心(为什么 )
动态或私用(Dynamic or Private)
Resvport -为客户机创建,用于C/S间的认证.
6553501024
周知口
1023
49151 49152
IANA 注册
BSD 保留端口
32768
50015000
65535
临时端口
Solaris 临时端口
动态或私用
IANA
BSD
65535resvport
513 1023
2007-3-2628
2.3.2 2.3.2 系统保留的端口号系统保留的端口号
tcpmuxtcpmux1/1/tcptcp
ztelnetztelnet2/2/tcptcp
echoecho7/7/tcptcp
echoecho7/7/udpudp
discarddiscard9/9/tcptcp
discarddiscard9/9/udpudp
systatsystat11/11/tcptcp
daytimedaytime13/13/tcptcp
daytimedaytime13/13/udpudp
netstatnetstat15/15/tcptcp
ftpftp--datadata20/20/tcptcp
ftpftp21/21/tcptcp
fspfsp21/21/udpudp
telnet telnet 23/23/tcptcp
smtpsmtp25/25/tcptcp
timetime37/37/tcptcp
timetime37/37/udpudp
nameservernameserver42/42/tcptcp
whoiswhois43/43/tcptcp
bootpsbootps67/67/tcptcp
bootpsbootps67/67/udpudp
bootpcbootpc68/68/tcptcp
bootpcbootpc68/68/udpudp
tftptftp69/69/udpudp
gophergopher70/70/tcptcp
gophergopher70/70/udpudp
fingerfinger79/79/tcptcp
wwwwww80/80/tcptcp
wwwwww80/80/udpudp
hostnameshostnames101/101/tcptcp
poppop--33110/110/tcptcp
poppop--33110/110/udpudp
nntpnntp119/119/tcptcp
imap2imap2143/143/tcptcp
imap2imap2143/143/udpudp
snmpsnmp161/161/udpudp
SnmpSnmp--traptrap162/162/udpudp
UNIXUNIX
loginlogin513/513/tcptcp
whowho513/513/udpudp
routeroute520/520/udpudp
uucpuucp540/540/tcptcp
2007-3-2629
2.3.3 2.3.3 TCPTCP端口号与并发服务器端口号与并发服务器
例:主机Bob,提供多用户FTP服务,
端口号21,IP地址10.10.10.1 .
初始化后:
-服务器IP-port对(10.10.10.1,21)
-客户机IP-port对(*,*)
客户机:Jack , FTP Client
IP 地址:192.168.0.1, 端口号1500/1501
(端口号由主机自动设定)
2007-3-2630
2.3.3 2.3.3 TCPTCP端口号与并发服务器端口号与并发服务器
(*,21, *,*)(*,21, *,*)
Listening socketListening socket
Bob, 10.10.10.1, Bob, 10.10.10.1,
FTP ServerFTP Server
Client 1Client 1
(192.168.0.1.1500,(192.168.0.1.1500,
10.10.10.1.21)10.10.10.1.21)
Jack, 192.168.0.1,Jack, 192.168.0.1,
(10.10.10.1.21,(10.10.10.1.21,
192.168.0.1.1500)192.168.0.1.1500)
Established socketEstablished socket
fork( )
连接请求连接请求
Client 2Client 2
(192.168.0.1.1501,(192.168.0.1.1501,
10.10.10.1.21)10.10.10.1.21)
Jack, 192.168.0.1,
(10.10.10.1.21,(10.10.10.1.21,
192.168.0.1.1501)192.168.0.1.1501)
Established socketEstablished socket
连接连接
连接连接
2007-3-2631
2.3.3 2.3.3 TCPTCP端口号与并发服务器端口号与并发服务器
(*,21, *,*)(*,21, *,*)
Listening socketListening socket
Bob, 10.10.10.1, Bob, 10.10.10.1,
FTP ServerFTP Server
Client 1Client 1
(192.168.0.1.1500,(192.168.0.1.1500,
10.10.10.1.21)10.10.10.1.21)
Jack, 192.168.0.1,Jack, 192.168.0.1,
(10.10.10.1.21,(10.10.10.1.21,
192.168.0.1.1500)192.168.0.1.1500)
Established socketEstablished socket
Client 2Client 2
(192.168.0.1.1501,(192.168.0.1.1501,
10.10.10.1.21)10.10.10.1.21)
Jack, 192.168.0.1,
(10.10.10.1.21,(10.10.10.1.21,
192.168.0.1.1501)192.168.0.1.1501)
Established socketEstablished socket
连接连接
连接连接
2007-3-2632
2.3.4 2.3.4 socket socket 工作原理工作原理
(面向连接的数据通信(面向连接的数据通信))
clientclient
socket( )socket( )
connect( )connect( )
write( )write( )
read( )read( )
close( )close( )
ServerServer
socket( )socket( )
bind( )bind( )
listen( )listen( )
read( )read( )
accept( )accept( )
write( )write( )
read( )read( )
阻塞,等待阻塞,等待
客户连接客户连接
处理服务要求处理服务要求
close( )close( )
建立连接(建立连接(TCPTCP三次握手)三次握手)
数据(应答)数据(应答)
关闭连接关闭连接
数据(请求)数据(请求)
阻塞,等待阻塞,等待
服务器连接服务器连接
2.4 2.4 socket socket 函数函数
2007-3-2634
2.4.1 2.4.1 socket socket 编程范例(编程范例(CC语言)语言)
一个简单的获取时间一个简单的获取时间//日期的程序日期的程序
1.1.建立与服务器的连接建立与服务器的连接
2.2.发送请求,等待响应发送请求,等待响应
3.3.接收数据并显示接收数据并显示
4.4.关闭连接,程序结束关闭连接,程序结束
1.1.初始化,等待客户机请求初始化,等待客户机请求
2.2.根据请求,准备数据根据请求,准备数据
3.3.将数据返回给客户机将数据返回给客户机
4.4.关闭连接,程序结束关闭连接,程序结束
时间服务器时间服务器客户机客户机
tick.tick.usnousno.navy.mil .navy.mil 美国海军天文台美国海军天文台
Clock.Clock.sgisgi.com SGI.com SGI
Tick.Tick.mitmit..edu edu 麻省理工学院麻省理工学院
Time.Time.nistnist..gov gov NISTNIST
2007-3-2635
2.4.22.4.2socket API socket API 函数详解(函数详解(11))
socket()
功能:功能:创建套接口,建立一套连接所用的数据结构并获创建套接口,建立一套连接所用的数据结构并获
得入口指针(但此时未与任何实际地址和端口对得入口指针(但此时未与任何实际地址和端口对
建立建立实际关联).实际关联).
用法用法::intintsocketsocket((intintaddraddr_domain, _domain, intintfamily_type, family_type,
intintprotocolprotocol))
参数参数::domain, domain, 一般设为一般设为AF_INETAF_INET, , 表示表示IPv4IPv4域协议域协议
family_type, family_type, 可为可为SOCK_STREAMSOCK_STREAM((TCP), TCP),
SOCK_DGRAMSOCK_DGRAM(UDP) (UDP) 和和SOCK_RAWSOCK_RAW
protocol, protocol, 协议类型,一般设为协议类型,一般设为00
返回值:返回值:成功成功——整型数,套接口整型数,套接口
失败失败——--11,赋予全局变量,赋予全局变量errnoerrno
2007-3-2636
2.4.22.4.2socket API socket API 函数详解(函数详解(11))
参数:参数:
domain, domain, AF_INETAF_INET, , IPv4IPv4域协议域协议((AFAF::地址族)地址族)
AF_INET6,AF_INET6,IPv6IPv6域协议域协议
AF_LOCAL, AF_LOCAL, UNIX UNIX 域协议域协议
AF_ROUTE, AF_ROUTE, 路由套接口路由套接口
AF_KEY, AF_KEY, 密钥套接口密钥套接口
family_type, family_type, SOCK_STREAMSOCK_STREAM((TCP), TCP),
SOCK_DGRAMSOCK_DGRAM(UDP) (UDP)
SOCK_RAWSOCK_RAW((原始套接口,低层数据原始套接口,低层数据))
SOCK_PACKETSOCK_PACKET( Linux, ( Linux, 链路层)链路层)
protocol, protocol, 协议类型,一般设为协议类型,一般设为00((SOCK_RAWSOCK_RAW除外)除外)
2007-3-2637
2.4.2 2.4.2 socket API socket API 函数详解(函数详解(22))
bindbind()()
功能:为套接口分配功能:为套接口分配((绑定绑定))本地本地IPIP地址和端口号地址和端口号
用法用法::intintbindbind((intintsock_sock_fdfd, const , const structstruct
sock_sock_addraddr*my_*my_addraddr, , socklensocklen_t_taddraddr__lenlen))
参数参数::sock_sock_fdfd, , 由由socketsocket()()创建的文件描述符创建的文件描述符
**my_my_addraddr, , 地址结构,用于存放本地地址地址结构,用于存放本地地址
和系统分配应用端口号和系统分配应用端口号((可指定或不指定可指定或不指定))
addraddr__lenlen, , sock_sock_addraddr地址结构所占空间地址结构所占空间
返回值:成功:返回值:成功:00
失败:失败:--11
2007-3-2638
2.4.2 2.4.2 socket API socket API 函数详解(函数详解(22))
为套接口分配为套接口分配((绑定绑定))本地本地IPIP地址和端口号,可能分配地址和端口号,可能分配
一个或一个都不分配(自动赋缺省值)一个或一个都不分配(自动赋缺省值)
进程指定进程指定
IPIP地址地址端口端口
通配地址通配地址
通配地址通配地址
本地本地IPIP地址地址
本地本地IPIP地址地址
00
非非00
00
非非00
内核选择内核选择IPIP地址和端口号地址和端口号
内核选择内核选择IPIP地址,进程指定端口号地址,进程指定端口号
地址,内核选择端口号地址,内核选择端口号
进程指定进程指定IPIP地址和端口号地址和端口号
结果结果
对对IPv4IPv4,,通配地址为通配地址为INADDR_ANYINADDR_ANY, , 值为值为00
2007-3-2639
2.4.32.4.3socket API socket API 函数详解(函数详解(33))
listenlisten()()
功能:只功能:只被被TCPTCP服务调用,把套接口转换为被动服务调用,把套接口转换为被动
套接口,并为可能的请求建立队列.套接口,并为可能的请求建立队列.
用法用法::intintlistenlisten((intintsock_sock_fdfd, , intintbacklogbacklog),),
在在bind bind 之后,之后,acceptaccept之前调用.之前调用.
参数:参数:sock_sock_fdfd——由由socket( )socket( )创建的套接口描述符创建的套接口描述符
backlog backlog ——本套接口连接请求队列可本套接口连接请求队列可
容纳的最大值,一般为容纳的最大值,一般为5~645~64
返回值:返回值:0 0 ——成功成功
--1 1 ——建立队列出错,出错号存建立队列出错,出错号存errnoerrno
2007-3-2640
2.3.42.3.4socket API socket API 函数详解(函数详解(44))
acceptaccept()()
功能:功能:由由TCPTCP服务调用,与等待连接的队列中的一个连服务调用,与等待连接的队列中的一个连
接请求建立联系,并为之创建一个新的套接口.如队列接请求建立联系,并为之创建一个新的套接口.如队列
空,进程进入睡眠状态空,进程进入睡眠状态..
用法:用法:intaccept(intsock_fd, structsock_addr
*client_addr, size_taddr_len)
参数参数::sock_sock_fdfd——由由listen( )listen( )建立的队列中的第一个建立的队列中的第一个
请求的描述符请求的描述符
client_client_addraddr——存放远程客户存放远程客户机的机的IPIP地址和端口号地址和端口号
addraddr__lenlen——客户机地址结构长度客户机地址结构长度
返回值:成功返回值:成功——一个新的套接口标识符一个新的套接口标识符
失败失败——--1 1 ,,出错号出错号存存errnoerrno
2007-3-2641
2.4.5 2.4.5 套接口队列处理说明(套接口队列处理说明(11))
问题的提出 问题的提出 Why Why 使用队列 使用队列
1.1.多任务多任务
2.2.网络传输时间(可能超时,丢包,队列满)网络传输时间(可能超时,丢包,队列满)
对于给定的监听套接口,内核必须提供两个队列:对于给定的监听套接口,内核必须提供两个队列:
1.1.未完成连接队列未完成连接队列((Incompleted connection queue)Incompleted connection queue)
由客户机发出并到达服务器,但等待由客户机发出并到达服务器,但等待TCPTCP三路握手过程,三路握手过程,
每个套接口每个套接口处于处于SYN_RCVDSYN_RCVD状态状态
2. 2. 已完成连接队列已完成连接队列((Completed connection queue)Completed connection queue)
服务器为每个完成服务器为每个完成TCPTCP三路握手过程的客户在队列中建三路握手过程的客户在队列中建
立一个条目,每个套接口立一个条目,每个套接口处于处于ESTABLISHED ESTABLISHED 状态状态
2007-3-2642
2.4.5 2.4.5 套接口队列处理说明(套接口队列处理说明(22))
1122
332211
服务器服务器
TCP
已完成连接队列
(ESTABLISHED)
未完成连接队列
(SYN_RCVD )
两队列之和不超过两队列之和不超过
BacklogBacklog
到达的到达的SYNSYN分段分段
((由由connectconnect发来发来))
三路握手完成三路握手完成
((收到客户机收到客户机AckAck))
accept( )
等待三路握手等待三路握手
完成或超时完成或超时
44
2007-3-2643
2.4.5 2.4.5 套接口队列处理说明(套接口队列处理说明(33))
SYN J
SYN KSYN K,,ackackJ+1J+1
ackackK+1K+1
connect( )connect( )
connect connect 返回返回
在未完成队列中建在未完成队列中建
立条目,立条目,accept( )accept( )
accept( )accept( )
从未完成队列移到从未完成队列移到
已完成连接队列已完成连接队列
客户机客户机服务器服务器
RTTRTT
(Round trip time)(Round trip time)
RTTRTT
2007-3-2644
2.4.62.4.6socket API socket API 函数详解(函数详解(55))
connectconnect()()
功能:功能:TCPTCP客户端用来向服务器提出连接请求,客户端用来向服务器提出连接请求,
并建立一个连接.并建立一个连接.
用法:用法:intintconnectconnect((intintsock_sock_fdfd, , const const structstruct
sock_sock_addraddr**servserv__addraddr, , sock_sock_lenlen_t_taddraddr__lenlen))
参数:参数:sock_sock_fdfd--由由socketsocket( )( )创建的套接口描述符创建的套接口描述符
servserv__addraddr--欲连接服务器的地址欲连接服务器的地址
addraddr__lenlen--地址长度地址长度
返回值:返回值:0 0 --成功,成功,--1 1 --出错出错
2007-3-2645
2.4.72.4.7socket API socket API 函数详解(函数详解(66))
write( ) write( ) ( ( 或或send( )send( )in Linux)in Linux)
功能:向已建立连接的套接口(文件)写数据功能:向已建立连接的套接口(文件)写数据
用法用法::ssizessize_t_twrite write ((intintsock_sock_fdfd,,volidvolid* * buff,buff,
size_tsize_tbuff_size)buff_size)
参数:参数:sock_sock_fdfd--已连接套接口描述符已连接套接口描述符
buff buff --发送数据的缓冲区发送数据的缓冲区
buff_size buff_size --发送数据包的长度发送数据包的长度
返回值:成功,返回发送数据包的长度返回值:成功,返回发送数据包的长度
失败,返回失败,返回--11
2007-3-2646
2.4.82.4.8socket API socket API 函数详解(函数详解(77))
read( ) read( ) ( ( 或或recvrecv( )( )in Linux)in Linux)
功能:从已建立连接的套接口(文件)读数据功能:从已建立连接的套接口(文件)读数据
用法:用法:ssizessize_t_treadread((intintsock_sock_fdfd,,volidvolid* * buff,buff,
size_tsize_tbuff_size)buff_size)
参数:参数:sock_sock_fdfd--已连接套接口描述符已连接套接口描述符
buff buff --读入数据的缓冲区读入数据的缓冲区
buff_size buff_size --接收到数据包的长度接收到数据包的长度
返回值:成功,返回接收到数据包的长度返回值:成功,返回接收到数据包的长度
失败,返回失败,返回--11
2007-3-2647
2.4.92.4.9socket API socket API 函数详解(函数详解(88))
sendtosendto()()
功能:用于功能:用于UDPUDP协议,向一主机发送数据包协议,向一主机发送数据包
用法:用法:intintsendtosendto((…………))
参数:参数:
返回值:返回值:
2007-3-2648
2.4.102.4.10socket API socket API 函数详解(函数详解(99))
recvfromrecvfrom()()
功能:用于功能:用于UDPUDP协议,接收一个协议,接收一个UDPUDP数据包数据包
用法:用法:recvfromrecvfrom((…………))
参数:参数:
返回值:返回值:
2007-3-2649
2.4.112.4.11socket API socket API 函数详解(函数详解(1010))
closeclose()()
功能:功能:
用法用法::intintcloseclose((intintsock_sock_fdfd))
参数:参数:sock_sock_fdfd--欲关闭的套接口描述符欲关闭的套接口描述符
返回值:成功返回值:成功--返回返回00
失败失败--返回返回--11
2007-3-2650
2.52.5socketsocket编程编程
数据结构数据结构及及辅助函数辅助函数
1.1.socketsocket地址结构地址结构::
2.2.TCP TCP 报头报头/ / IPIP报头报头//UDPUDP报头报头结构结构
3.3.基本转换函数:基本转换函数:
--inetinet__itoaitoa, , inetinet__addraddr, , inetinet__ntoantoa
--inetinet__ptonpton, , inetinet__ntopntop
--bzerobzero, , bcopybcopy, , bcomp bcomp
4.4.其他函数其他函数
getpeernamegetpeername( ) ( ) 获取远程主机信息获取远程主机信息
gethostnamegethostname( ) ( ) 获取本地主机信息获取本地主机信息
2007-3-2651
2.5.12.5.1socket socket 地址结构地址结构
1.1.socket_socket_addraddr
InternetInternet套接口地址结构套接口地址结构
structstructin_in_addraddr{{
in_in_addraddr_t s__t s_addraddr; ;
}}
structstructsockaddrsockaddr_in {_in {
uint8_t sin_uint8_t sin_lenlen;;
sasa_family_t sin_family; /*AF_INET */_family_t sin_family; /*AF_INET */
in_port_t sin_port;in_port_t sin_port;
structstructin_in_addraddrsin_sin_addraddr; ;
char char sin_zero[8];sin_zero[8];
}}
2007-3-2652
2.5.22.5.2协议报头结构协议报头结构
2007-3-2653
2.5.32.5.3基本转换函数基本转换函数
1.1.Why use these Why use these functonsfunctons
2.2.网络字节顺序与主机字节顺序网络字节顺序与主机字节顺序
3.3.数据转换数据转换
高位字节高位字节低位字节低位字节Little-endian
内存地址增大方向内存地址增大方向
高位字节高位字节低位字节低位字节big-endian
内存地址增大方向内存地址增大方向
2007-3-2654
查看主机字节顺序查看主机字节顺序
aixaix% % byteorderbyteorder
powerpcpowerpc--ibmibm--aix4.2.0.0: bigaix4.2.0.0: big--endian endian
alpha % alpha % byteorderbyteorder
alphaalpha--decdec--osf4.0 : littleosf4.0 : little--endianendian
sun % sun % byteorderbyteorder
sparcsparc--sunsun--sunos4.1.4: bigsunos4.1.4: big--endianendian
hpuxhpux% % byteorderbyteorder
hppa1.1hppa1.1--hphp--hpux10.30: bighpux10.30: big--endianendian
linuxlinux% % bytrorderbytrorder
i586i586--pcpc--linuxlinux--gnu: littlegnu: little--endianendian
2007-3-2655
字节转换函数字节转换函数
##include
uint16_t uint16_t hhtotonnss( uint16_t host16bitvalue);( uint16_t host16bitvalue);
uint32_t uint32_t hhtotonnll( uint32_t host32bitvalue);( uint32_t host32bitvalue);
返回返回网络字节顺序值网络字节顺序值
uint16_t uint16_t nntotohhss( uint16_t host16bitvalue);( uint16_t host16bitvalue);
uint32_t uint32_t nntotohhll( uint32_t host32bitvalue);( uint32_t host32bitvalue);
返回返回主机字节顺序值主机字节顺序值
2007-3-2656
inetinet__atonaton,,inetinet__addraddr
和和inetinet__ntoantoa函数函数
在在ASCIIASCII字符串(字符串(202.207.240.225202.207.240.225)与网络字)与网络字
节顺序的二进制(存于套接口地址结构中)间节顺序的二进制(存于套接口地址结构中)间
转换地址.转换地址.
##include
intintinetinet__atonaton(const char *(const char *strptrstrptr,,structstructin_in_addr addr * *
addrptraddrptr););
返回:返回:11————串有效,串有效,00————串有错串有错
in_in_addraddr_t _t inetinet__addraddr(const char * (const char * strptrstrptr););
返回:若成功,返回返回:若成功,返回3232位二进制的网络字节序地址;若有错,则返位二进制的网络字节序地址;若有错,则返
回回INADDR_NONEINADDR_NONE
char * char * inetinet__ntoantoa((structstructin_in_addraddrinaddrinaddr););
返回:指向点分十进制数串的指针返回:指向点分十进制数串的指针
2007-3-2657
inet_pton和inet_ntop
For both IPv4 and IPv6For both IPv4 and IPv6
p: presentation IPp: presentation IP地址的文字表述(点分法)地址的文字表述(点分法)
n: numeric IPn: numeric IP地址的数字表述(二进制)地址的数字表述(二进制)
IPv6IPv6地址:地址:
55f1bf1b::df00df00::ce3ece3e::f200f200::2020::800800::::64266426
::::::::::::ffffffff::ffffffff
2007-3-2658
##include
intintinetinet__ptonpton((intintfamily, const char * family, const char * strptrstrptr, ,
void *void *addrptraddrptr););
返回:返回:11————成功,成功,00————输入不是有效的表达格输入不是有效的表达格
式,式,--11————出错出错
const char * const char * inetinet__ntopntop((intintfamily, const void family, const void
**addrptraddrptr, char *, char *strptrstrptr, size_t , size_t lenlen););
返回:指向结果的指针返回:指向结果的指针——成功,成功,
NULLNULL——出错出错
2007-3-2659
2.5.42.5.4其他函数(其他函数(11))
getpeernamegetpeername()()
功能:获取远程主机信息,如功能:获取远程主机信息,如IPIP地址等地址等
用法:用法:intintgetpeernamegetpeername((intintsockfdsockfd, , structstruct
sockaddrsockaddr**peeraddrpeeraddr, , socklensocklen_t *_t *addrlenaddrlen));;
参数:参数:
返回值:返回值:0 0 --OK, OK, --1 1 --失败失败
2007-3-2660
2.5.42.5.4其他函数(其他函数(22))
gethostnamegethostname()(()(getsocknamegetsockname() () ))
功能:获取本地主机信息功能:获取本地主机信息
用法:用法:intintgethostnamegethostname((intintsockfdsockfd, , structstruct
sockaddrsockaddr**localaddrlocaladdr, , socklensocklen_t *_t *addrlenaddrlen)); ; ))
参数:参数:
返回值:返回值:0 0 --OK, OK, --1 1 --失败失败
2007-3-2661
2.62.6Winsock APIsock API
1.1.在在windows windows 操作系统下运行的操作系统下运行的socket socket
函数集.函数集.1616位位vs. 32vs. 32位位Winsock.Winsock.dlldll..
2.2.在各种编程语言中表示不同.在各种编程语言中表示不同.
3.3.面向对象的面向对象的Winsock API (Java , C++, Winsock API (Java , C++,
J++)J++)
4.4.还有一些还有一些..liblib库,如果未能包括,链库,如果未能包括,链
接时会出错.接时会出错.
2007-3-2662
本章小结本章小结
1.1.SocketSocket定义和组成(四元组)定义和组成(四元组)
2.2.TCPTCP三次握手建立连接(三次握手建立连接(PiggybackPiggyback))
3.3.TCPTCP四次握手关闭连接四次握手关闭连接
4.4.如何使用如何使用SocketSocket函数实现通信双方连接,函数实现通信双方连接,
数据交换和连接关闭数据交换和连接关闭
5.5.常用套接口函数常用套接口函数
2007-3-2663
第第22章作业章作业