4、TCP 与 UDP
4.1、传输层的作用
-
IP 首部:协议字段,标识在网络层的上一层所采用的传输层协议。
-
传输层首部:根据端口号,标识在传输层的上一层应用层的具体应用程序。
-
C/S 模式
- Server:服务端,守护程序(daemon)提前启动,等待客户请求。提供服务的一方。
- Client:客户端,使用服务的一方。
-
套接字(Socket)
4.2、端口号
- 数据链路层:MAC 地址
- 网络层:IP 地址
- 传输层:端口号
- 端口号:识别同一台计算机中进行通信的不同应用程序。
- TCP/IP 或 UDP/IP 通信:通常采用 5 个信息
- 源主机 IP 地址
- 目标主机 IP 地址
- 协议号
- 源主机端口号
- 目标主机端口号
-
确定方式
-
静态方法:每个应用程序指定端口号。
- 知名端口号(Well-Known):0 到 1024 之间;
- 应用程序应避免使用知名端口号:19152 到 65535 之间
-
动态方法(时序分配法)
- 服务器需要监听端口号,但客户端无需确定端口号;
- 操作系统可以为每个应用程序分配互不冲突的端口号(如在之前分配号码的基础上加 1);
- 取值在 49152 到 65535之间。
-
静态方法:每个应用程序指定端口号。
- 端口号由传输层协议决定,不同传输协议可以使用相同的端口号。
- 数据到达接收端 IP 层后,会先检查 IP 首部的协议号,再传给相应传输层协议的模块。
4.3、UDP
用户数据报协议(User Datagram Protocol)
面向无连接的,不可靠的数据报协议。
- 无连接:收到应用程序的数据时,立刻按照原样发送到网络上。
- 不可靠性:不负责可靠的细节控制,若有需要则由采用 UDP 的应用程序处理。
-
场景
- 包总量较少:DNS、SNMP 等;
- 即时通信:视音频等多媒体;
- 广播通信:广播、多播;
- 限定于 LAN 等特定网络的应用通信。
4.4、TCP
传输控制协议(Transmission Control Protocol)
面向连接的、可靠的流协议。
- 面向连接:确认通信对端存在时,才会发送数据。
-
可靠性:实现了数据传输时的控制功能
- 保序、重发、流量控制、拥塞控制、提高网络利用率等;
- 通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制实现。
ACK & SEQ
- ACK(Postive Acknowledgement):确认应答
- SEQ(Sequence Number):序列号
TCP 通过 ACK 和 SEQ 实现可靠传输。
ACK
-
当发送端的数据到达接收端主机时,接收端主机会返回一个已收到的通知。
-
超时重发:在一定时间内没有收到 ACK,认为数据已丢失,进行重发。
问题:ACK 可能在途中丢失或延迟到达。
- 发送端主机只需重发数据;而接收端主机会反复收到相同的数据,并将其丢弃。
- 需要一个机制:让接收端主机能识别是否已经接收数据,是否需要接收。
- 这个机制就是序列号。
SEQ
-
按顺序给发送数据的每个字节,都标上序号。
-
接收端主机查询 TCP 首部中的序列号、数据长度;
-
将确认应答号(自己下一步应该接收的序号)作为 ACK 返送给回去。
重发超时
重发超时:在重发数据之前,等待 ACK 到来的时间间隔。
- 每次发包时,都会计算 RTT 及其偏差。
- RTT(Round Trip Time):报文端的往返时间
- 偏差:RTT 的波动值,也称抖动。
- 重发超时:比 RTT 和 偏差的总和稍大的值。
- 最初的数据报没有 RTT,其重发超时设为 6s 左右。
- 重发后还是收不到 ACK,则再次重发。达到一定次数后,判断网络或接收端主机异常,强制关闭连接。
连接管理:SYN & FIN
SYN 和 FIN 各占一个序列号(SEQ)。
- SYN(Synchronize):同步序列号;
- FIN(Finish):断开序列号。
-
SYN:建立连接的请求。
- 若对端发来 ACK,认为可以进行数据通信。
- 若对端 ACK 未到达,则不会进行数据通信。
-
FIN:断开连接。
-
三次握手,四次挥手
MSS
最大消息长度(Maximum Segment Size)
-
TCP 传送数据,以 MSS 的大小将数据进行分割发送(包括重发)。
-
MSS 在三次握手时,在两端主机之间计算得出。
- 发出建立连接请求时,会在 TCP 首部中写入 MSS 项;
- 在二者之间选择一个较小的值作为 MSS。
窗口控制
-
如果每发一个段(segment)就进行一次 ACK 的处理,会降低通信性能。
-
窗口:ACK 不是以段为单位,而是以窗口大小为单位。
-
窗口大小:无需等待 ACK 而可以发送数据的最大值。
-
缓冲区(Buffer)
- 发送端:在收到数据对应的 ACK 之前,在缓冲区中存储这部分数据。
- 接收端:在收到不按顺序的数据时,在缓冲区存储这部分数据。
-
滑动窗口控制
- 在窗口内的数据即使没有收到 ACK,也可以继续发送;
- 收到 ACK 后,将窗口滑动到 ACK 中确认应答号的位置;
- 按顺序地将多个段同时发送,以提高通信性能。
重发控制
- 窗口控制中未收到 ACK 的情况
- ACK 未能返回:ACK 在途中丢失,但发送的数据已到达对端,无需重发。
- 报文端丢失
-
高速重发控制:
- 接收端主机如果收到一个应接受的序号以外的数据,会针对当前为止收到的数据返回 ACK。
- 在窗口比较大,出现报文端丢失的情况下,同一个序号的 ACK 会重复返回;
- 发送端主机如果连续 3 次收到同一个 ACK,会将对应数据进行重发。
流量控制
-
流量控制(流控制):发送端根据接收端的实际接收能力,控制发送的数据量。
- 接收端主机向发送端主机通知主机可以接收的数据的大小(窗口大小);
- 发送端发送的数据不会超过窗口大小。
-
窗口大小(Windows Size):TCP 首部中的字段
- 接收端主机可以将自己的接收缓冲区的大小,放入该字段,通知发送端。
- 值越大说明网络吞吐量越高。
- 当缓冲区面临数据溢出,窗口大小的值也会减小,从而控制数据发送量。
-
窗口探测:仅含一个字节
- 当接收端主机缓冲区满时,发送端主机会暂停发送数据,等待接收端主机的窗口更新通知。
- 超过重发超时后还未收到通知,发送端主机会时不时地发送一个窗口探测的数据段,以获取最新的窗口大小信息。
拥塞控制
- 拥塞窗口(CWND)
-
慢启动算法
- 慢启动时,将 CWND 设为 1MSS;
- 发送数据时,比较 CWND 与接收端主机通知的窗口大小;选择较小的值,发送还要小的数据量。
- 每收到一次 ACK,将 CWND 加一。
-
慢启动阈值:当 CWND 大于阈值,每收到一次 ACK 只允许按比例扩大 CWND。
- TCP 通信开始时,没有设置慢启动阈值。
- 超时重传:阈值设为 CWND 的一半。
- 重复收到三次 ACK:阈值设为当前窗口大小的一半毛病将窗口设为(阈值 + 3MSS)
提高网络利用率
- Nagle 算法:发送端的还有少部分数据待发送时,延迟发送。
- 延迟确认应答
- 捎带应答:应用层发出的消息到达对端,对端处理后返回一个回执。