UDP
1. 命名
User Datagram Protocol 用户数据报协议
2. 有无连接
随时发送数据,无需连接
3. 通信方式
单播、多播、广播
单播
:一台主机给一台主机发送数据
多播
:一台主机给多台主机中的一部分发送数据
广播
:一台住距给多台主机所有发送数据
4. 对应用报文的处理
发送时直接添加首部。接收时直接除去首部。纯面向报文
5. 是否提供可靠的传输服务
因无连接,提供的是不可靠服务。即,UDP 发送方不会在意误码、丢包,接收方不做任何处理,只管接受
优点:
- 保证实时性。网络直播、视频会议
6. 首部开销
UDP 头部包含了以下几个数据
- 源端口端口号(可选字段)(2 字节)
- 目标端口(2 字节)
- 整个数据报文的长度(2 字节)
- 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误(2 字节)
TCP
1. 命名
Transmission Control Protocol 传输控制协议
2. 有无连接
三次握手建立连接 -> 数据传输 -> 四次挥手释放连接
3. 通信方式
单播
4. 对应用层报文的处理
- 流程
发送方将数据块分割并存储在缓存,根据策略提取一定量字节,添加首部发送。接收方提取 TCP 报文中的数据并存储在缓存,将缓存中一部分字节流交给应用进程。纯面向字节流。
-
注意
- TCP 并不知道字节流的含义,因此接收方需要具备理解字节流的能力
- 发送方发送的数据块和和接收方接收的数据块,数量可能不等。如发送方将 4 个数据块,打包成 2 个发出
- TCP 可以同时双向传输
5. 是否提供可靠的传输服务
接收方收到并确认无误后,会给发送方返回一个确认报文。如果发送方没有收到确认报文,会进行超时重发,直到(事实上有上限次数)收到接收端的确认报文。
TCP 会严格控制传输的正确性,一旦有某一个数据对端没有收到,就会停止下来直到对端收到这个数据。
6. 首部开销
对于 TCP 头部来说,以下几个字段是很重要的
-
32 位序号
Sequence number,这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文 -
确认序号
Acknowledgement Number,这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一个序号的数据已经收到 -
窗口大小
Window Size,表示还能接收多少字节的数据,用于流量控制 -
标识符
- URG=1:该字段为一表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
- ACK=1:
确认标志位
,该字段为一表示确认序号字段有效。此外,TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一。 - PSH=1:该字段为一表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。
- RST=1:该字段为一表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝非法的报文段和拒绝连接请求。
- SYN=1:
请求或应答标志位
,当 SYN=1,ACK= 0 时,表示当前报文段是一个连接请求报文。当 SYN=1,ACK= 1 时,表示当前报文段是一个同意建立连接的应答报文。 - FIN=1:
结束标志位
,该字段为一表示此报文段是一个释放连接的请求报文。
7. 三次握手
-
第一次:客户端 -> 服务端
包含字段 字段值 说明 随机生成 Sequence number 随机生成 假设 10000 返回 Seq 需从 10000 开始 SYN 标志位 1 -
第二次:服务端 -> 客户端
包含字段 字段值 说明 Sequence 假设 20000 SYN 标志位 1 ACK 标志位 1 确认消息有效 确认序号 Acknowledgement 12345 确认序号段有效 客户端:已经知道我发送的消息,服务端可以收到
服务端:不知道我发送的消息,客户端是否可以收到
-
第三次:客户端 -> 服务端
包含字段 字段值 说明 ACK 标志位 1 确认序号 Acknowledgement 20001
整个过程叫双工
8. 四次挥手
-
客户端 -> 服务端
包含字段 字段值 说明 FIN 1 Sequence 25368 -
服务端 -> 客户端
包含字段 字段值 说明 Acknowledgement 25639 ACK 1 服务端首先响应客户端断开请求,可能这时候有别的数据请求正在处理
-
服务端 -> 客户端
包含字段 字段值 说明 Sequence 10568 FIN 1 客户端知道,可以断开了
-
客户端 -> 服务端
包含字段 字段值 说明 ACK 1 Acknowledge 20569 服务端知道,可以断开了
TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN 标志位置为 1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ack 标志位置为 1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个 ack 标志位置 1 的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。
UDP 和 TCP 区别
– | UDP | TCP |
---|---|---|
命名 | User Datagram Protocol 用户数据报协议 | Transmission Control Protocol 传输控制协议 |
有无连接 | 随时发送数据,无需连接 | 三次握手建立连接 -> 数据传输 -> 四次挥手释放连接 |
通信方式 | 单播、多播、广播 | 单播 |
对应用层报文的处理 | 发送时直接添加首部。接收时直接除去首部。纯面向报文 | 发送方将数据块分割并存储在缓存,根据策略提取一定量字节,添加首部发送。接收方提取 TCP 报文中的数据并存储在缓存,将缓存中一部分字节流交给应用进程。纯面向字节流。 |
是否提供可靠的传输服务 | 因无连接,提供的是不可靠服务。即,UDP 发送方不会在意误码、丢包,接收方不做任何处理,只管接受 | 接收方收到并确认无误后,会给发送方返回一个确认报文。如果发送方没有收到确认报文,会进行超时重发,直到(事实上有上限次数)收到接收端的确认报文。 |
首部开销 | 四个字段,每个字段 2 字节。共 8 字节 | 由于 TCP 需要实现可靠传输、流量控制和拥塞控制等服务,首部比较复杂。TCP 的首部包括 20 字节的固定首部,以及最多 40 字节的拓展首部 |
References
计算机网络面试必考点:TCP 和 UDP
【深度讲解 + 面试回答】tcp/ip 协议三次握手、四次挥手,通俗易懂,