UDP协议
UDP特点
- UDP是无连接的
- UDP尽最大努力交付
- UDP是面向报文的
- UDP没用拥塞控制
- UDP支持一对一、一对多、多对多交互通信
- 首部开销小
UDP报文格式
各字段意义如下:
1. 源端口:源端口号。在需要对方回信时选用,不需要时可全0
2. 目的端口:目的端口号
3. 长度:UDP数据报总长度。最小值为8(仅有首部)
4. 校验和:用于纠错
5. 伪首部:伪首部仅是计算校验和时临时加在UDP首部前,仅用于计算校验和,既不向上递交也不向下传送。
TCP协议
TCP特点
- TCP是面向链接的
- 每条TCP链接只能有2个端点
- TCP提供可靠交付的服务
- TCP提供全双工通信
- 面向字节流
TCP协议格式
各字段意义:
1. 源端口和目的端口:标识用于建立连接的应用程序的端口号、
2. 序号:占4字节。TCP是面向字节流的。在传输过程中会对TCP字节流中的每一个字节按序编号。首部中序号指本段报文中第一个字节的序号。
3. 确认号:占4字节。是期望收到对方下一个报文段的第一个数据字节的编号。确认号为N表明到序号N-1所有数据都已收到。
4. 数据偏移:占4位。指TCP数据部分距离了TCP报文起始处的偏移。实际上就是首部长度。数据偏移的单位是4字节。所以TCP首部最长为60字节。
5. 保留:占6位。还未使用,目前置0
6. 控制位:占6位,意义见7-12
7. 紧急URG:当URG=1时,表明紧急指针字段有效。它告诉系统报文中有紧急内容,要尽快传递
8. 确认ACK:当ACK为1时确认字段有效。TCP规定,连接建立后所有报文ACK为1
9. 推送PSH:用的很少
10. 复位RST:当RST为1时说明TCP中出现严重差错,必须释放链接,然后重新建立
11. 同步SYN:在建立连接时使用,SYN=1且ACK=0说明平这是 一个连接请求报文段。对方同意建立连接,则在响应报文中设置SYN=1且ACK=1、
12. 终止FIN:用于释放链接
13. 窗口:占2字节。指发送报文段的接收窗口的大小
14. 检验和:占2字节。计算校验和时,和UDP一样要加上伪首部
15. 紧急指针:占2字节,仅在URG=1时有用。
16. 选项:长度可变,最长40字节。
TCP链接的建立过程
TCP协议使用三次握手(three-way handshake)来建立连接
过程如下:
1. 主机A发送SYN报文,报文中ISN(初始服务序号)随机(seq=200),SYN=1,不携带数据
2. 主机B收到SYN请求报文后,如果同意建立链接,则发送SYN应答报文,报文中ISN随机(seq=500),SYN=1,ACK=1,确认序号为200+1,也不携带数据
3. 主机A收到应答后,再次向主机B确认,确认报文中,ISN=200+1,确认号=500+1,SYN=1,可以携带数据。如果不携带数据,则主机A的下一个报文ISN还是201
三次握手完成三个重要功能:
1. 同一连接协商,确保双方做好了传输数据的准备
2. 协商各自的初始ISN号(ISN为各自随机选取)
3. 协商MMS(最大报文长度,指的是TCP数据部分长度,只有SYN报文能协商)
之所以三次握手,主要是为了防止已失效的链接请求又到达B,因而产生错误
TCP可靠性
可靠交付主要解决的2个问题是丢失和乱序。
防止丢失的机制
为了防止数据丢失,TCP使用“带重传的确认肯定”技术。具体如下图:
发送方发送报文后,需要等待下一个报文的确认报文到达后才继续发送。在发送报文同时,发送方会启动一个定时器,如果在限定时间内没有收到确认报文,则认为该报文超时,重新发送该报文
防止重复和乱序的机制
重传机制可能导致重复,为了解决这个问题,TCP给每个报文制定唯一序号,这样重复和乱序问题就得到了解决。注意,TCP是对字节进行编号,报文序号是指该报文的第一个字节的序号
TCP的确认机制
TCP指明期望收到的下一个报文的序号。同时TCP采用累计确认机制,结合滑动窗口,累计确认机制可以减少重复确认。TCP还是用捎带确认提高信道利用率
滑动窗口
如图:
p1,p3分别是窗口边界指针,p2为已发送数据指针。窗口内所有的数据都是可发送的。当A收到应答报文后,根据应答报文中ACK的值,使p1向前移动至ACK+1位置,然后根据应答报文中窗口字段的值移动P3,调整发送窗口大小。注意,理论上P3可以向后移动,但是强烈不赞成这么做。
TCP拥塞控制
TCP采用四种算法来进行拥塞控制:慢启动,拥塞避免,快重传,快恢复。下面介绍前2种算法。
发送方在发送时需要维持一个拥塞窗口cwnd。发送方发送的字节大小要小于cwnd大小。同时存在慢启动门限(ssthresh),用于控制采取慢启动还是拥塞避免算法。
慢启动是指开始时,cwnd大小为1MSS,即只能发送1个MSS大小的数据,然后每收到一个确认,窗口大小加1MSS,知道达到慢启动门限(ssthresh)。
拥塞避免是指当cwnd大小达到慢启动门限(ssthresh)后,只有当窗口内所有的报文收到确认才将cwnd大小加1。然后当网络中出现拥塞(没有按时收到确认),就将cwnd大小置为1,同时将sstresh置为当前cwnd的一半。
示例见下图:
快重传和快恢复是对以上2种算法的改进,这里不讨论。
IP层对TCP的支持
最初,当路由器发生拥塞时,采取的策略是尾部丢弃,这样的策略有很大弊端。考虑这样的一个场景:2台主机同时向一个路由器发送数据,由于发送过快,路由器需要丢掉尾部的数据报。然后2台主机均检测到拥塞,然后同时将cwnd降到最小值1MSS,再次开始慢启动。导致网络中通信量骤降。这个现象叫做全局同步。全局同步导致网络中通信量骤降,而网络回复后,通信量又会猛增。
为了避免出现全局同步现象,路由器采取一种叫做随机早起丢弃的方法。设定2个值,tmax和tmin,当队列长度小于tmin时,把新到达的分组加入队列。当队列长度大于tmax时,把新到达的分组丢弃,当队列长度在2者之间时,按一定概率随机丢弃到达的分组。
TCP释放链接
TCP关闭链接采用改进的三次握手方式(也叫四次握手)。具体如图:
1. 客户端发送完所有数据后发送一个FIN报文,其ISN为x,执行主动关闭。
2. 服务器端收到报文后,发送一个ACK报文,确认报文同建立连接,确认号为x+1。同时通知应用层通信已结束。
3. 当服务器端的应用层处理完成后,关闭它的连接,向主动关闭方发送FIN报文段,其ISN为y。
4. 客户端收到关闭报文,发送最后一个ACK报文,其确认号为y+1。
改进的三次握手护和三次握手的区别在于服务器端返回确认ACK和返回FIN是分开的。这是因为TCP是全双工,必须双向关闭。同时,这也让TCP可以提供半关闭能力。所谓瓣关闭就是指一端结束发送过程后还有接受来自另一端数据的能力。也就是说,在上图过程2后,客户端还有接受服务器端数据的能力。而客户端也可以向服务器端发送确认,知道服务器端发出FIN报文关闭此方向连接为止。
总结
传输层的两个协议基本复习的差不多了。先是复习UDP的特点和数据报格式,然后是TCP的特点和数据包格式,紧接着从TCP的链接建立,可靠传输的保证,到滑动窗口,再到拥塞控制,IP层对TCP的支持,最后TCP链接的释放。还有些细节没有涉及,比如说定时重传算法等。不过传输层的主体没什么问题了。