




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TCP/IP协议及应用编程1 概述TCP/IP协议允许不同的计算机和不同的操作系统之间进行通信. 它构成了现有因特网和计算机局域网的基础.1.1 分层T C P / I P通常被认为是一个四层协议系统,如下图所示:Figure 11: TCP/IP协议族分层每一层负责不同的功能:1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。3 ) 运输层主要为两台主机上的应用程序提供端到端的通信。在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途。4 ) 应用层负责处理特定的应用程序细节。几乎各种不同的T C P / I P实现都会提供下面这些通用的应用程序:Telnet, FTP, HTTP, SMTP等.假设在一个局域网( L A N)如以太网中有两台主机,二者都运行F T P协议,下图列出了该过程所涉及到的所有协议:Figure 12: 局域网上运行FTP的两台主机1.2 封装当应用程序用T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如下图所示:Figure 13: 数据进入协议栈时的封装过程当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。下图显示了该过程是如何发生的:Figure 14: 以太网数据帧处理过程2 TCP协议2.1 TCP服务T C P提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用T C P的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个T C P连接。在一个T C P连接中,仅有两方进行彼此通信。广播和多播不能用于T C P。T C P通过下列方式来提供可靠性: 应用数据被分割成T C P认为最适合发送的数据块。这和U D P完全不同,应用程序产生的数据报长度将保持不变。由T C P传递给I P的信息单位称为报文段或段( s e g m e n t) 当T C P发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 当T C P收到发自T C P连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。 T C P将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, T C P将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 既然T C P报文段作为I P数据报来传输,而I P数据报的到达可能会失序,因此T C P报文段的到达也可能会失序。如果必要, T C P将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 既然I P数据报会发生重复, T C P的接收端必须丢弃重复的数据。 T C P还能提供流量控制。T C P连接的每一方都有固定大小的缓冲空间。T C P的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。两个应用程序通过T C P连接交换8 bit字节构成的字节流。T C P不在字节流中插入记录标识符。我们将这称为字节流服务( byte stream service)。如果一方的应用程序先传1 0字节,又传2 0字节,再传5 0字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这8 0个字节,每次接收2 0字节。一端将字节流放到T C P连接上,同样的字节流将出现在T C P连接的另一端。另外,T C P对字节流的内容不作任何解释。T C P不知道传输的数据字节流是二进制数据,还是A S C I I字符、E B C D I C字符或者其他类型数据。对字节流的解释由T C P连接双方的应用层解释。2.2 TCP首部下图显示T C P首部的数据格式。如果不计任选字段,它通常是2 0个字节。Figure 21: TCP包首部U R G 紧急指针( urgent pointer)有效。A C K 确认序号有效。P S H 接收方应该尽快将这个报文段交给应用层。R S T 重建连接。S Y N 同步序号用来发起一个连接。F I N 发端完成发送任务。2.3 连接的建立与终止为了建立一条T C P连接:1) 请求端(通常称为客户)发送一个S Y N段指明客户打算连接的服务器的端口,以及初始序号(I S N,在这个例子中为1 4 1 5 5 3 1 5 2 1)。这个S Y N段为报文段1。2) 服务器发回包含服务器的初始序号的S Y N报文段(报文段2)作为应答。同时,将确认序号设置为客户的I S N加1以对客户的S Y N报文段进行确认。一个S Y N将占用一个序号。3) 客户必须将确认序号设置为服务器的I S N加1以对服务器的S Y N报文段进行确认(报段3)。这三个报文段完成连接的建立。这个过程也称为三次握手( three-way handshake)。建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由T C P的半关闭(h a l f -c l o s e)造成的。既然一个T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个F I N来终止这个方向连接。当一端收到一个F I N,它必须通知应用层另一端几经终止了那个方向的数据传送。当服务器收到这个F I N,它发回一个A C K,确认序号为收到的序号加1(报文段5)。和S Y N一样,一个F I N将占用一个序号。同时T C P服务器还向应用程序传送一个文件结束符。接着这个应用程序就关闭它的连接,导致它的T C P端发送一个F I N(报文段6),客户必须发回一个确认,并将确认序号设置为收到序号加1(报文段7)。Figure 22: TCP连接的建立与终止2.4 Nagle算法我们编写的应用程序经常出现很多小分组, 如telnet协议等。在局域网上,这些小分组通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些小分组则会增加拥塞出现的可能。一种简单和好的方法就是采用RFC 896 Nagle 1984中所建议的N a g l e算法。该算法要求一个T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反, T C P收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组. 有时我们的应用程序需要最小的时延和最快的响应速度, 这时我们就需要关闭N a g l e算法。我们可以使用SOCKET API中的T C P _ N O D E L A Y选项来关闭Nagle算法。2.5 滑动窗口下图用可视化的方法显示了TCP的滑动窗口协议。Figure 23: TCP滑动窗口的可视化表示提供的窗口: 对端缓冲区总的大小可用的窗口: 对端缓冲区空闲的大小发送和接收缓冲区大小可以通过SOCKET API来设置. 选择合适和缓冲区大小有利于提高网络性能. 经常传输大块数据(如文件数据)等, 可以使用较大的缓冲区.2.6 超时和重传TCP在发送分组时会启动相应的重传定时器. 改定时器的时间为RTT. RTT的值会不断变化, TCP会不断测量每次从分组发出到收到ACK的时间间隔来计算RTT的值. 当重传多次时, RTT的值也会不断变大. 有关RTT的计算公式和拥塞避免算法参考.3 TCP协议实现3.1 网络实现概述下图描述了网络各层之间的接口:Figure 31: 网络输入输出的层间通信其中插口层指Socket层. 接口层指Interface层.3.2 SOCKET描述符UNIX中socket描述符关联的内核数据结构如下图所示:Figure 32: SOCKET关联的内核数据结构上图是UDP的例子, TCP协议除了有PCB还有TCB数据块.3.3 TCP函数下图描述了TCP协议实现的相关入口函数:Figure 33: TCP函数与其他内核函数之间的关系3.4 TCP状态迁移图T C P协议根据连接上到达报文的不同类型,采取相应动作,协议规程可抽象为下图所示的有限状态变迁图。Figure 34: TCP状态迁移图3.5 mbufmbuf是一种针对网络协议而专门设计的数据结构. 采用mbuf能减少数据拷贝过程, 提高协议栈的性能. 有关mbuf的具体描述请将4 TCP应用编程4.1 客户端和服务端下图显示了客户端和服务端同时建立两个连接的情况:Figure 41: 客户端和服务端建立两个连接其中fork是UNIX创建子进程的函数, 其他操作系统可以用线程等处理. 一般客户端需要调用以下几个函数建立连接: SOCKET socket( int af, int type, int protocol); int connect( SOCKET s, const struct sockaddr FAR *name, int namelen);下图从客户端观点表示了TCP Server/Client模式:Figure 42: 客户端观点一般服务端需要调用以下几个函数建立连接: SOCKET socket( int af, int type, int protocol); int bind( SOCKET s, const struct sockaddr FAR *name, int namelen ); int listen( SOCKET s, int backlog); SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);下图从服务端观点表示TCP Server/Client模式:Figure 43: 服务端观点关闭连接不管是服务端还是客户端都采用以下两个函数: int shutdown( SOCKET s, int how );用来禁止发送或接收数据或都禁止 int close(SOCKET s); 注意: Windows 系统是closesocket()函数.4.2 公用函数4.2.1 字节序转换根据计算机体系结构的不同, 字节序分为little-endian和big-endian两种. 如下图所示:Figure 44: 字节序如果在不同字节序的计算机之间传输数据, 一般推荐采用big-endian进行传输. 不管计算机的字节序如何, Socket address struct中的域段必须使用网络字节序(即big-endian). 以下是几个字节序转换的函数:uint16_t htons(uint16_t host16bitvalue) ;uint32_t htonl(uint32_t host32bitvalue) ;uint16_t ntohs(uint16_t net16bitvalue) ;uint32_t ntohl(uint32_t net32bitvalue) ;4.2.2 地址转换The Internet (IPv4) socket address structure: sockaddr_in.struct in_addr in_addr_t s_addr; /* 32-bit 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; /* 16-bit TCP or UDP port number */ /* network byte ordered */ struct in_addr sin_addr; /* 32-bit IPv4 address */ /* network byte ordered */ char sin_zero8; /* unused */;The generic socket address structure: sockaddr.struct sockaddr uint8_t sa_len; sa_family_t sa_family; /* address family: AF_xxx value */ char sa_data14; /* protocol-specific address */;这两种结构的内容和长度一致, 指针可以相互转换.以下是几个有关地址转换的函数:int inet_aton(const char *strptr, struct in_addr *addrptr);/Returns: 1 if string was valid, 0 on errorin_addr_t inet_addr(const char *strptr);/Returns: 32-bit binary network byte ordered IPv4 address; INADDR_NONE if error char *inet_ntoa(struct in_addr inaddr);/Returns: pointer to dotted-decimal string4.3 Socket Options以下两个函数分别用来读取和设置socket options:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname, const void *optval socklen_t optlen);其中对于TCP socket, level常用的有以下三种: SOL_SOCKET: 通用socket option IP_PROTOIP: IP协议socket option IP_PROTOTCP: TCP协议socket option4.3.1 通用Socket Options以下说明几个常用的Socket Options:SO_KEEPALIVE Socket Option: TCP Socket可以设置这个选项来检测物理连接是否断开. 但发送的时间间隔是系统给定值(一般大于半个小时), 不能自己设置. 所以这个失去了实际意义. 如果需要监视物理链路状态, 一般在应用层间隔一段时间发出检测包.SO_LINGER Socket Option: 默认情况下, 应用层调用close()函数会马上返回, 但是如果发送缓冲区还有数据未发送, 协议层会尽力发送剩下的数据. 通过这个选项用户可以改变协议层的行为. 以下是linger option struct:struct linger int l_onoff; /* 0=off, nonzero=on */ int l_linger; /* linger time, POSIX specifies units as seconds */;以下几个图说明了当设置不同值时, 协议层的处理:Figure 45: 默认情况下的处理Figure 46: 设置Linger为On, l_linger为正值的情况Figure 47: 设置Linger为On, 超时的情况其他情况参考各自操作系统的帮助文档.SO_RCVBUF and SO_SNDBUF Socket Options: 设置接收缓冲区和发送缓冲区的大小SO_REUSEADDR Socket Options: 这个选项对服务端比较有用, 当我们bind一个本地地址时, 可能前一次建立的连接还没有完全关闭. 这是设置该选项可以bind同一地址到新的socket上.4.3.2 IP Socket OptionsIP_TOS Socket Option: 设置IP head中TOS字段的值. 该字段被路由器用来进行优先级划分. 具体参考IP协议RFC文档.IP_HDRINCL Socket Option: 由用户指定IP头部, 一般用在RAW Socket中.4.3.3 TCP Socket OptionsTCP_NODELAY Socket Option: 关闭或打开Nagle算法.4.4 传输数据发送和接收数据可以采用以下两个函数: int send( SOCKET s, const char FAR *buf, int len, int flags); int recv( SOCKET s, char FAR *buf, int len, int flags);注意TCP提供的是基于字节的数据流服务, 所以不保证一次发送对应一次接收. 一般情况下, 应用层要自己对数据进行分界. 有以下两种数据分界的方法: 采用特殊标识表示数据结束, 如HTTP/Telnet协议中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园老师学分管理制度
- 幼儿园防入侵设备管理制度
- 广东学校收退费管理制度
- 建筑企业公司标准管理制度
- 当公司开始重视管理制度
- 微信会员卡分店管理制度
- 技工培训日常生活管理制度
- 报社通讯员队伍管理制度
- 招商办公室保密管理制度
- 新成立小公司财务管理制度
- 西方经济学-马工程重点教材-第16章
- 营造林技能竞赛试题及答案
- 地图学(临沂大学)智慧树知到课后章节答案2023年下临沂大学
- 人工智能安全ppt
- 国开学前儿童科学教育活动指导形考1-4试题及答案
- 2023陕西省教师招聘考试《教育心理学》重点题型汇编
- 北京市工伤保险医疗费用手工报销申报表
- 2023年电池车间MES解决方案
- BSCI验厂全套程序文件
- 2022-2023学年苏教版高一数学新教材教学讲义第4章 指数与对数 单元综合测试卷
- 2023春国开个人与团队管理模拟测试1试题及答案
评论
0/150
提交评论