目录
MSS 和 MTU
UDP 和 TCP 区别及应用场景
UDP头部中有哪些信息?
TCP头部中有哪些信息?
TCP的长连接如何实现
TCP粘包和解决
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP是一种提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
MSS 和 MTU
MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
UDP 和 TCP 区别及应用场景
TCP 和 UDP 区别:
1. 连接
- TCP 是面向连接的传输层协议,传输数据前先要建立连接。
- UDP 是不需要连接,即刻传输数据。
2. 服务对象
- TCP 是一对一的两点服务,即一条连接只有两个端点。
- UDP 支持一对一、一对多、多对多的交互通信
3. 可靠性
- TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。
4. 拥塞控制、流量控制
- TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
- UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
5. 首部开销
- TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。最大为15,即60字节。
- UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
6. 传输方式
- TCP 是流式传输,没有边界,但保证顺序和可靠。
- UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
7. 分片不同
- TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
- UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层。
TCP 和 UDP 应用场景:
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
- FTP 文件传输;
- HTTP / HTTPS;
由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于:
- 包总量较少的通信,如 DNS 、SNMP 等;
- 视频、音频等多媒体通信;
- 广播通信;
UDP头部中有哪些信息?
UDP 不提供复杂的控制机制,利用 IP 提供面向「无连接」的通信服务。
UDP 协议真的非常简,头部只有 8 个字节(64 位),UDP 的头部格式如下:
- 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
- 报文长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
- 校验和:校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。
下是UDP校验和的计算方式:
数据分段:首先,数据报文被分割成多个16位的字(或者称为16位字,即两个字节),如果数据长度不是16位的整数倍,最后一个字节将被扩展为16位。
求和:将这些16位字依次相加,形成一个32位的中间和,如果中间和的高16位不为0,将其加到低16位上,得到最终的16位和。
取反:将最终的16位和按位取反(将0变为1,1变为0)。
存储:将这个取反后的16位和放入UDP报文头部的校验和字段。
接收方在接收UDP数据报时执行相同的计算,将数据和接收到的校验和字段进行相同的校验和计算。如果接收方的计算结果与发送方发送的校验和相同,那么数据包被认为是完整的;如果计算结果不同,那么数据包可能在传输过程中发生了错误或损坏。
TCP头部中有哪些信息?
- 序号(32bit):在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
- 确认序列号(32bit):指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
- 首部长度(4bit):标识首部有多少个4字节 * 首部长,最大为15,即60字节。
- 标志位(6bit):
-
- URG:标志紧急指针是否有效。
- ACK:标志确认号是否有效(确认报文段)。用于解决丢包问题。
- PSH:提示接收端立即从缓冲读走数据。
- RST:表示要求对方重新建立连接(复位报文段)。
- SYN:表示请求建立一个连接(连接报文段)。
- FIN:表示关闭连接(断开报文段)。
- 窗口(16bit):接收窗口。用于告知对方(发送方)本方的缓冲还能接收多少字节数据。用于解决流控。
- 紧急指针: 用于指示在TCP数据流中的紧急数据的位置。紧急数据是指在通信中需要立即处理的数据,通常用于通知接收方在其它数据之前立即处理某些特殊情况。
- 校验和(16bit):接收端用CRC检验整个报文段有无损坏。
TCP的校验和计算方式如下:
数据分段:首先,TCP数据流被分割成多个TCP段。每个TCP段包括TCP头部和TCP数据。
伪头部:在计算校验和之前,需要创建一个伪头部(Pseudo-Header),该伪头部包括以下信息:
源IP地址
目标IP地址
协议字段(TCP的协议号,通常是6)
TCP段的长度(包括TCP头部和TCP数据的总长度)
数据合并:将伪头部和TCP段的内容合并成一个连续的字节序列。
求和:对上述合并后的字节序列进行16位的求和。具体做法是将数据分成16位的块,然后依次相加,如果最终结果超过16位,则将高位溢出的部分加到低位上。
取反:将16位的求和结果按位取反(将0变为1,将1变为0)。
存储:将取反后的16位值放入TCP报文头部的校验和字段。
接收端在接收TCP段时执行相同的计算,将数据与接收到的校验和字段进行相同的校验和计算。如果接收方的计算结果与发送方发送的校验和相同,那么数据包被认为是完整的。如果计算结果不同,那么数据包可能在传输过程中发生了错误或损坏,接收端会丢弃它。
TCP的长连接如何实现
TCP长连接是指在TCP协议中,两个通信节点之间建立的一种持久的连接,可以在通信过程中保持打开状态,而不需要每次都重新建立连接。
TCP长连接可以通过以下几种方式实现:
- 心跳机制:客户端和服务器端定时发送心跳包,以保证连接的活跃状态。
- 保活机制:客户端和服务器端通过设置超时时间来保证连接不会被关闭。
- 重传机制:当数据包丢失时,客户端会自动重传数据包,以保证数据的完整性。
TCP粘包和解决
当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文,也就是一个完整的用户消息被拆分成多个 TCP 报文进行传输。
这时,接收方的程序如果不知道发送方发送的消息的长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的,因为用户消息被拆分成多个 TCP 报文后,并不能像 UDP 那样,一个 UDP 报文就能代表一个完整的用户消息。
我们不能认为一个用户消息对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议。
当两个消息的某个部分内容被分到同一个 TCP 报文时,就是我们常说的 TCP 粘包问题,这时接收方不知道消息的边界的话,是无法读出有效的消息。
要解决这个问题,要交给应用程序。
如何解决粘包?
粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息。
一般有三种方式分包的方式:
- 固定长度的消息;
- 发送方:在每个消息前添加一个固定长度的消息头,该消息头包含了消息的长度信息。接收方:根据消息头中的长度字段来准确地划分消息。
- 05Hello10World,消息头包含了消息的长度信息,"05"表示第一个消息的长度为5个字节,"10"表示第二个消息的长度为10个字节。
- 特殊字符作为边界;
- 发送方:在每个消息的末尾添加一个特殊的字符(例如换行符 '\n')作为消息的结束标志。接收方:根据特殊字符来分割消息。
- Hello\nWorld\n,接收方根据换行符来划分两个消息,分别是"Hello"和"World"
- 自定义消息结构。
- 发送方:使用自定义的消息结构,例如JSON,同时在消息中包含长度信息或其他分隔标志。接收方:解析消息结构来准确地划分消息。
- {"length": 5, "message": "Hello"}{"length": 10, "message": "World"},接收方解析JSON消息结构中的长度字段,然后根据长度信息来划分消息。