谈谈传输层的UDP与TCP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37774696/article/details/79091444

传输层的概述

传输层为应用进程之间提供了端到端的逻辑通信,在该层中主要有两个协议:无连接的用户数据报协议(UDP)和面向连接的传输控制协议(TCP)

传输层的端口

运输层用16位端口号来标志一个端口,允许有65535个不同端口,特别要注意的是这些端口是只针对本地才有意义的,两台不同的主机即使拥有同个端口号,此时这两个端口是没什么关系的。端口号总共分为三类:

  1. 0-1023:熟知端口号或系统端口号,例如:FTP(21)HTTP(80)
  2. 1023-49151:登记端口号。必须到IANA按照规定手续办理登记。
  3. 49152-65535:客户端端口号又称短暂端口号

UDP的概述

UDP只在IP数据包提供的服务上增加了复用,分用,差错检错服务,主要有一下几个特点:

1 无连接服务;
2.面向报文,UDP直接拿了应用层交付给自己的报文,加上UDP首部后直接交给网络层;
3.UDP是尽最大努力交付,为不可靠的交付 ;
4.UDP没有拥塞控制,无论网络环境怎么样,还是会一直保持恒定速率发送。可应用于一些对数据没有多大要求的应用(IP电话,视频);
5.UDP支持一对一,一对多,多对多的交互通信;
6.首部只有8个字节,开销比较少。

(1)源端口 2 字节 在对方需要回信时可用,不需要时可以全 0;

(2)目的端口 2 字节 必须,也是最重要的字段;

(3)长度 2 字节 长度值包括报头和数据部分;

(4)校验和 2 字节 用于检验 UDP 数据报在传输过程中是否有出错,有错就丢弃。

UDP的首部格式

UDP数据包有两个字段:首部字段和数据字段,其中首部字段只有8个字节,由四个字段组成,各占两个字节,分别为源端号(当不需要回信时,可为0),目的端口,长度(最小为8,仅有首部),检验和。
这里写图片描述
其中需要注意的是伪首部,并非正真存在的首部,不会向上上交也不会向下传送,只被用于计算校验和(注意传输层计算校验和会将首部和数据一起来算,而网络层IP计算检验和只用首部)

TCP概述

TCP主要有以下几个特点:
1.面向连接的传输层协议;
2.每次连接只能有两个端点(IP:端口号),也称作套接字。不支持广播和多播;
3.面向字节流;
4.提供可靠的传输服务;
5.提供全双工的通信。

TCP的首部格式

TCP报文的首部前20个子节是固定的,后面的4N的字节是根据需要添加,因为TCP定义了的数据最大偏移量为60个字节,所以说首部最多为60个子节,最小则为20个字节。
这里写图片描述
20 字节的固定部分,各字段功能说明:

扫描二维码关注公众号,回复: 4192187 查看本文章

1.源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。

2.序号:占 4 字节序,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。 TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号。

3.确认序号:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。

4.数据偏移:占 4 位,指 TCP 报文段的报头长度,包括固定的 20 字节和选项字段。

5.保留:占 6 位,保留为今后使用,目前为 0。

6.控制位:共有 6 个控制位,说明本报文的性质,意义如下:

*URG 紧急:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。
ACK 确认:仅当 ACK=1 时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
PSH 推送:若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以“催促”对方,不再等到缓存区填满才发送。
RET 复位:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。
SYN 同步:用于建立和释放连接,稍后会详细介绍。
FIN 终止:用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放 TCP 连接。*
7.窗口:占 2 个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。

8.检验和:2 个字节。和 UDP 报文一样,有一个检验和,用于检查报文是否在传输过程中出差错。

9.紧急指针:2 字节。当 URG=1 时才有效,指出本报文段紧急数据的字节数。

10.选项:长度可变,最长可达 40 字节。常见的有SACK选择确认项,窗口扩大选项,时间戳。

TCP的流量控制

主要是来让发送方不要发送太快,要让发送方来得及接收。每次发送方会维持一个发送窗口,而接收方会有一个接收窗口。当接收方来不及接收时,会发送一个rwnd给发送方,告诉此时接收窗口的大小,这时发送方会将自己的发送窗口变小,传输的数据就会少点,从而达到了流量控制的目的。不过有时会出现一个成为糊涂窗口综合症,就是接收方的接收缓存已满,而应用程序每次只用一个字节,那么发送方就只能一次发一个字节,网络效率极差。

TCP的拥塞控制

主要是根据网络的情况,控制发送方的传送速度。这里主要实现算法有:
1.慢开始(需要注意的是慢开始并非指增长速度慢,是指最开始将发送窗口定为1字节):这个阶段cwnd增长是翻倍
2.拥塞避免:每次cwnd只增加1
3.快重传
4.快恢复

TCP运输连接管理

运输连接有三个阶段:连接建立,数据传送,连接释放。这里主要讲连接建立和连接的释放。

1. 连接建立

个人理解的文字描述:
首先由客户机建立主动连接,而服务器属于被动连接。最开始服务创建传输控制块TCB,进入了LISTEN(收听)状态,接着客户机也创建了TCB,发送了一个SYN=1;seq=x的报文段给服务器,客户机进入SYN-SENT(同步已发送)状态T。当服务器正常收到了该报文后,会发送一个SYN=1;ACK=1;seq=y;ack=x+1给客户机,服务器进入SYN-RCVD(同步已接收)状态。当客户机正常收到服务器发回的报文后,客户机会再发一个确认报文段ACK=1;seq=x+1;ack=y+1,客户机进入了ESTABLISHED(建立连接)状态。这个过程也被称为TCP建立连接的三次握手。

TCP规定在ACK报文段可以传送数据,如果不传送数据则不消耗序列号,即上面建立连接后数据的序列号可以为x+1
这里写图片描述

2.连接释放

个人理解的文字描述:
先有客户机发送一个FIN=1;seq=u(其中u为前面发送最后的一个字节序列号加1),客户机进入FIN-WAIT-1(终止等待1),服务器接收到这个报文段后,会发送一个ACK=1;seq=z;ack=u+1(其中z为最后接收到的字节序列号加1),服务器进入CLOSE-WAITD(等待关闭)状态,客户机收到这个确认后进入FIN-WAIT-2((终止等待2)此时就证明客户机到服务器端这个方向的连接已经断开,而服务器端到客户端这个方向的连接还没释放,服务器还可以向客户机发送数据,一直到服务器没有数据要发送给该客户机时,会发送FIN=1,ACK=1;seq=w;ack=u+1给客户机,服务器进入LAST-ACK(最后确认)状态·,客户机接正确收到这个报文段,发送一个ACK=1;seq=u+1;ack=w+1给服务器,客户机进入TIME-WAIT(一般等待时间为2msl)。服务器收到这个报文段后就进入CLOSED(关闭连接状态),客户机等待了2msl后进CLOSED(关闭连接状态)。这个过程称作TCP连接释放的四次挥手。

这里写图片描述

希望以上阐述能帮助到在学习的小伙伴们!有什么问题,也欢迎大家多多指教!

猜你喜欢

转载自blog.csdn.net/m0_37774696/article/details/79091444