参考自B站王道考研视频
UDP
仅在IP数据报服务之上增加了复用分用和差错检测功能。
UDP特点
- UDP是无连接的,减少开销和发送数据之前的时延。
- UDP使用最大努力交付,即不保证可靠交付。
- UDP是面向报文的,适合一次性传输少量数据的网络应用,比如QQ和微信 (传输大文件时除外)。
- UDP无拥塞控制,适合很多实时应用,比如在线直播,视频会议。
- UDP首部开销小,只有8B,而TCP的首部有20B。
UDP首部格式
UDP首部包含四个部分,其中源端口不是必须的,而目的端口是必须的,长度为首部加数据的总长度,校验和用于检测整个UDP数据报是否有错。伪首部只有在计算校验和时才出现,不向下传送也不向上递交,它是伪IP首部。
UDP校验
发送端:
- 填上伪首部
- 全0填充校验和字段
- 全0填充数据部分,要保证长度为4B的整数倍,但是只是计算时填充
- 伪首部+首部+数据部分采用二进制反码求和,溢出部分进位到最低位。
- 把和求反码填入校验和字段(0变1,1变0,即相加后全为1)
- 去掉伪首部,发送
接收端:
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和
- 结果全为1则无差错,否则丢弃数据报/交给应用层并附上出差错的警告。
TCP
TCP特点
- TCP是面向连接(虚连接)的传输层协议。
- 每一条TCP连接只有两个端点,只能是点对点的。
- TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重。
- TCP提供全双工通信。发送缓存保存的是准备发送的数据和已发送但尚未收到确认的数据,接收缓存保存的是按序到达但尚未被接受应用程序读取的数据和不按序到达的数据。
- TCP面向字节流。TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。(流:流入到进程或从进程流出的字节序列)
TCP首部格式
序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。占4个字节,最大表示4GB,若溢出则从0开始。 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则说明到序号N-1为止的所有数据都已正确收到。 数据偏移:TCP报文段的数据起始处距离TCP报文段的起始处的长度,其实就是表示首部长度,因为首部长度不固定,所以需要这样一个字段,因为4bit最多表示15,所以TCP首部最长为15x4即60字节。 URG:紧急位,URG=1时,表明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。 ACK:确认位,ACK=1时确认号才有效,在连接建立后所有传送的报文段都必须把ACK置为1。 PSH:推送位,PSH=1时,接收方应尽快交付应用程序,不再等到缓存填满再向上交付。 RST:复位,RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接。可以用来拒绝非法报文段或者拒绝打开连接。 SYN:同步位,SYN=1时,表明是一个连接请求/连接接收报文。 FIN:终止位,FIN=1时,表明此报文段发送方的数据已发送完,要求释放连接。 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。 检验和:检验首部+数据,检验时要加上12B的伪IP首部,第四个字段为6。(UDP为17) 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数,因为紧急数据位于数据部分的开头。 选项:最大报文段长度MSS(数据字段)、窗口扩大、时间戳、选择确认 填充:填充0保证首部为4B的整数倍。
TCP连接建立
Round 1:客户端发送连接请求报文段,无应用层数据。
SYN=1,seq=x(随机)
Round 2:服务器为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
SYN=1,ACK=1,seq=y(随机),ack=x+1
Round 3:客户端为该TCP连接**分配缓存和变量**,并向服务器端返回确认的确认,可以携带数据。
SYN=0,ACK=1,seq=x+1,ack=y+1
TCP的连接释放
Round 1:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u
Round 2:服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了——半关闭状态。
ACK=1,seq=v,ack=u+1
Round 3:服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
FIN=1,ACK=1,seq=w,ack=u+1
Round 4:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
ACK=1,seq=u+1,ack=w+1
TCP可靠传输
网络层提供最大努力交付,为不可靠传输,而传输层使用TCP实现可靠传输。 可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
TCP实现可靠传输的机制:校验,序号,确认,重传 TCP默认使用累计确认,即不会来一个报文段就发送确认,而是要等到当前收到字节前面所有的部分都已到达再发送确认,否则一直发送上一个确认 。 超时重传:TCP的发送方在规定的时间内(重传时间)没有收到确认就要重传已发送的报文段。 TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。
冗余ACK(冗余确认):每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明期待的下一个字节的序号。 快速重传:当发送方收到3个冗余报文段则认为报文段丢失,重传丢失报文段,不需要等待重传时间耗尽再重传。
TCP流量控制
TCP利用滑动窗口机制实现流量控制。 在通信过程中,接收方根据自己接受缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口大小取接收窗口rwnd和拥塞窗口cwnd的最小值。
为了防止出现“死锁”(即发送方收到0窗口值报文段后一直等待,而接收方新发出的非0窗口值报文段丢失导致它们互相等待),TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段,接收方收到探测报文段时给出现在的窗口值。若窗口仍然是0,那么发送方就重新设置持续计时器。
TCP拥塞控制
流量控制:点到点 拥塞控制:全局,防止过多的数据注入到网络中。
拥塞控制的四种算法: 慢开始+拥塞避免 快重传+快恢复
发送窗口 = Min{接收窗口rwnd,拥塞窗口cwnd} 接收窗口:接收方根据接收缓存设置的值,并告知给发送方,反映接收方容量。 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
|