TCP报文
1 | TCP头部重要字段 |
Sequence number
此序号保证了TCP传输的报文都是有序的,对端可以通过序号顺序拼接报文Acknowledgement Number
此序号标识数据接收期望接收的下一个字节的编号是多少,同时也标识上一个序号的数据已经收到Window Size
窗口大小,标识还能接收多少字节的数据,用于流量控制- 标识符
- RUG=1 该字段表示 数据部分包含紧急信息,是一个高优先级数据报文
- ACK=1 该字段 在TCP建立后传送的所有报文必须把
ACK
设置为1 - PSH=1 表示接收端应该理解将数据push给应用层
- RST=1 表示TCP连接出现严重的问题,可能需要重新建立TCP连接
- SYN=1 SYN=1andACK=0表示当前报文段是一个连接的请求报文,SYN=1andACK=1表示当前报文是一个统一建立连接的应答报文
- FIN=1 表示此此表文是一个释放连接的请求报文
TCP建立连接三次握手
- 不管是客户端还是服务端,TCP连接建立后都能发送数据和接收数据,所以TCP是一个全双工协议
- 期初两端都是
closed
状态,通信开始,双方都会创建TCB
。服务器创建完TCB
都进入LISTEN状态,等待客户端发送数据
第一次握手
客户端向服务端发送连接请求 SYN=1
报文段,该报文中包含自身的数据通讯初始序号,请求发送后,客户端进入 SYN-SENT
状态
第二次次握手
服务端接受到 SYN=1
报文段,如果同意连接,则会发送一个 SYN=1 and ACK=1
的应答,包含自身的数据通信初始序号,发送完进入 SYN-RECEIVED
状态
第三次次握手
- 当客户端收到
SYN=1 and ACK=1
的同意连接的应答后,还要向服务端发送一个确认ACK=1
的确认报文,客户端发问后进入ESTABLISHED
状态。服务端接受这个应答后也进入ESTABLISHED
状态,此时连接成功。
TCP为何建立连接需要三次握手,明明两次就可以
- 背景,在建立连接中,任意一段掉线,TCP都会重复SYN包,一般会重试5次。TCP有超时重传机制
- 主要为了防止出现失效的连接请求报文文段被服务端接受的情况,从而产生错误
- 可以想象如下场景。客户端发送了一个连接请求 A,但是因为网络原因造成了超时,这时 TCP 会启动超时重传的机制再次发送一个连接请求 B。此时请求顺利到达服务端,服务端应答完就建立了请求,然后接收数据后释放了连接。
- 假设这时候连接请求 A 在两端关闭后终于抵达了服务端,那么此时服务端会认为客户端又需要建立 TCP 连接,二次握手的情况下,服务端应答了该请求并进入 ESTABLISHED 状态。但是客户端其实是 CLOSED 的状态,那么就会导致服务端一直等待,造成资源的浪费。
TCP断开四次握手
UDP
特性:
面向无连接
- 不需要向
TCP
一样三次握手,想发数据就可以发 - 不会对数据报文进行任何拆分和拼接操作
- 发送端:应用层将数据传递给传输层的UDP协议,只会给数据增加一个
UDP
头标识一下是UDP
协议,然后就传递给网络层了 在接收端:网络层将数据传递给传输层,UDP
只取出IP报文头就传递给应用层,不会做任何拼接操作
- 不需要向
不可靠性
- 体现在无连接上,通信不需要建立连接,想发就发,不可靠
- 收到什么数据就传递什么数据,不会备份数据,发送数据也不关心对方是否已经接收到数据了
- 不判断网络环境,
UDP
无阻塞控制,一直以恒定速度发送数据,不会对发送速率进行调整。弊端是网络条件不好的情况下可能会导致丢包。 对实时性要求高的场景就需要使用UDP而不是TCP
高效
UDP
头部开销小,只有8个字节,TCP二十个字节- 不可靠,不复杂,需要保证数据不丢失有序到达
- 两个十六位的端口号,Source port分别为源端口,Destination port目标端口 length整个数据报文的长度
- checksum整个数据报文的检测,用于发现头部信息和数据中的错误
- 传输方式
UDP
支持一对一,一对多,多对多,多对一,提供单播,多播,广播的功能 - 适合应用场景
实时性要求高的场景,直播,游戏,视频会议
##TCP UDP区别
- 不需要向
TCP
一样三次握手,想发数据就可以发 - TCP 建立连接断开连接都需要先进行握手,TCP 传输数据过程中,通过各种算法保证数据可靠性。没有UDP高效