一、传输层协议
TCP特点: 面向连接 可靠 适用于可靠性要求高的应用 开销大 UDP特点: 无连接 不可靠 适用于更关注传输效率的应用 可靠性由应用层负责 |
TCP主要功能:可靠、准确的传输并控制源主机与目的主机之间的信息流; TCP主要职责:提供端到端的控制,通过滑动窗口机制提供流控制,通过序号和确认号机制来保证可靠性; 功能如下: 连接管理:定义了允许两个用户像直接连接一样开始交谈的规则(类似于电话通信之前须拨通对方的号码)。通常把连接的定义和建立的过程称为握手。 流量控制:以网络能普遍接受的速度发送数据,从而防止网络拥塞造成数据包的丢失。传输层独立于底层而运行。传输层的流量控制与数据链路层的流量控制区别在于,传输层定义了端到端用户之间的流量控制,数据链路层协议定义了两个中间的相邻节点的流量控制。 差错检测:数据链路层的差错检测功能提供了可靠的链路传输,但仍无法保证源点和目的之间的传输完全无错,比如网络中的路由器收到了完整无缺的ip分组,但是在将含有分组的帧重新格式化的过程中出现了影响分组内容的错误。这种错误可能是由于软件或硬件导致的。而这种错误,数据链路层无法检测到。传输层的差错检测机制可以检测到这种错误。 对用户请求的响应:包括对发送和接受数据请求的响应以及特定请求的响应,如用户可能要求高吞吐量,低延迟或可靠服务。 |
二、IP报文格式
URG/ACK/RSH/SYN/FIN TCP报文格式 |
UDP数据段格式: 源端口号,目标端口号字段:占16B。作用于TCP数据段中的端口号字段相同,用来标示源段和目标端的应用程序; 长度字段:占16B。表明UDP头部和UDP数据的总长度字节; 校验和字段:占16B。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的。 TCP分段格式: 源端口号,目标端口号字段:占16B。TCP协议通过使用“端口”来标示源端和目标端的应用程序。端口号可以使用0~65535之间的任何数字。在收到服务请求时,操作系统动态的为客户端的应用程序分配端口号。在服务器端,每种服务在“众所周知的端口”为用户提供服务; 序列号字段:占32b。用来标示从TCP源端向TCP目标端发送的数据字节流,他表示在这个报文段中的第一个数据字节。 确认号字段:占32b。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。 首部字段:给出头部占32b的数目。没有任何选项字段的TCP头部长度为20b,最多可以有60b的TCP头部。 标志位字段(U,A,P,R,S,F)字段:占6b。 URG:紧急指针有效; ACK:确认序号有效; PSH:接收方应该尽快将这个报文段交给应用层。 RST:重建连接; SYN:发起一个连接; RIN:释放一个连接; 窗口大小字段:占16b。用来进行流量监控。单位为字节数,这个值是本机期望一次接收的字节数。 校验和字段:占16b。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。 紧急指针字段:占16b。他是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 可选项字段:占32b。可能包括“窗口扩大因子”、“时间戳”。 ip报文格式: 版本字段:占4b。用来表明ip协议实现的版本号; 服务类型字段:占8b。其中前3b为优先权字段。第8bit保留未用。第4值第7bit分别代表延迟、吞吐量、可靠性和花费。当值为1时,分别代表最小时延、最大吞吐量、最高可靠性和最小花费。若全为0时,表示一般服务。服务类型字段声明了数据报被网络系统传输时可以怎样处理。例如,telnet协议可能要求有最小的延迟。实际上,大部分主机会忽略这个字段,而一些动态路由协议如ospf可以根据这些字段的值进行路由决策。 总长度字段:占16b。指明整个数据报的长度; 标示符字段:占16b。用来唯一标示主机发送的每一份报文,通常每发一份他的值会加1; 标志字段:占3b。标志一份数据报是否要求分段; 片偏移字段:占13b。用来如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置; 生存期字段:占8b。用来设置数据报最多可以经过的路由器数量,有发送数据的源主机设置,通常为32,64,128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。 协议字段:占8b。指明ip层所封装的上层协议类型,如icmp(1),igmp(2),tcp(6),udp(17). 套接字:把一个ip地址和一个端口号合称为套接字。套接字对可以唯一的确定互联网中每个TCP连接的双方(客户ip地址、客户端口号、服务器ip、服务器端口号) |
三、TCP/IP数据传输
1.1TCP连接建立、释放时的握手过程
为什么是三次握手,而挥手需要四次? TCP数据传输是全双工的,是双向的,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。 |
TCP三次握手: 第1步,首先由客户端向服务器发起连接,将数据包的序列号标为X,SYN置位,由于是双方发起的第一次连接,所以确认号为0。 第2步,服务器端收到客户端发来的连接请求后,将对连接请求作出应答。客户端主机发送一个随机序列号为Y的数据包给客户端,同时确认号置为X+1,SYN置位。 第3步,客户端收到服务器端的连接确认后,对该数据包在做确认。发送一个序列号为X+1,确认号为Y+1的数据包给对方。这样一个双向的TCP连接建立好了。 这样就可以传输数据了,当数据结束之后,就需要断开连接,过程如图,FIN:结束段,用来描述终止一个连接的消息。 TCP三次握手是如何保证连接的可靠性? 如果接收方B在收到发送方A的连接请求分段N后,发送确认分段M后就开始等待数据。由于网络层ip的不可靠,可能使得确认信息丢失,这样会使得发送方A认为接收方B没有确认,而事实上,接收方正在等待发送方传送数据分段确认,为避免接收方盲目等待,接受方B要收到发送方的对他的确认后才开始等待,如果没有收到发送方的确认,他将认为自己的确认丢失了,将反复重传刚才的确认分段M。对于发送方也一样,在收到B的确认后,立即对B的确认做确认,然后开始发送数据。但如果A发送的对B的确认分段丢失了,B没收到确认的确认,不会认为连接已经建立好了,只会反复重传以前的确认分段。但如果在这样重复的对上一次的动作做确认,就回进入无休止的确认中。所以,在效率与可靠性的权衡中取了三次握手来尽可能的保证连接的可靠,同时也保证了一定的效率。 |
1.2TCP可靠传输技术
当TCP连接建立后,为保证数据传输的可靠性,需要对传输的数据进行确认。
首先,TCP对每一个分段都做了32为的编号,称为序列号。每一个分段都按照从起始号递增的顺序进行编号。每一次传输数据时表明该段的编号,以便对方确认。确认不需要单独发包做确认,可以放在传到对方的TCP分段中,在TCP协议中并不直接确认收到哪些分段,而是通知发送方下一次该发送哪一个分段,表示前面的分段都已经收到,如果收到分段后没有分段要马上传到对方,TCP协议的确认通常采用延时几分之一秒后再做确认,而不是收到一个确认一个,接收端可能收到从X到X+N的N个后才开始确认,直接在确认字段中标X+N+1,通知对方下一次直接传N+X+1分段,这样减少确认的次数增加确认的效率。如果M(M《N)分段在传输中出错,则确认X+M通知发送方从X+M开始重传X+M分段以及以后所有分段。
1.3TCP流量控制
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息:
一是期望接收到的下一字节的序号。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是 2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。
二是当前的窗口大小m;
在这个图中,我们将字节从1至11进行标号。接收方通告的窗口称为提出的窗口,它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。我们知道窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。
我们使用三个术语来描述窗口左右边沿的运动:
- 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。
- 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了T C P的接收缓存时。
- 当右边缘向左移动时,称之为窗口收缩。
1.4拥塞窗口
迄今为止,在本章所有的例子中,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽缓存,[Jacobson 1988]证明了这种连接方式是如何严重降低了TCP连接的吞吐量的。现在,TCP需要支持一种被称为“慢启动(slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。