上周有敌人去了字节面试,问到了TCP
三次握手的问题,过后答复的不是很好,对于三次握手的发送的报文信息都不太熟,本文次要做一下总结和记录。
TCP
全称为Transmission Control Protocol
(传输控制协议),是一种面向连贯的、牢靠的、基于字节流
的传输层通信协议。TCP
也是全双工通信协议,示意客户端能够给服务端发送音讯,服务端也能够向客户端发送音讯。
报文
TCP
处于ISO
七层模型的传输层
,传输层的单位是报文
,报文信息如下:
Source port 和 Destination port
其中Source port
和Destination port
别离代表发送端口
和接管端口
。两个不同机器上的过程通信,须要通过端口
和IP协定中的IP
标识惟一的过程。
Sequence number 和 Acknowledgment number
Sequence number
示意序列号
,示意要发送数据的起始号,在上面的三次握手应用seq
示意,Acknowledgment number
示意确认号
,返回确认号,示意音讯曾经接管,返回下次要发送的起始号。在上面的三次握手应用ackNum
标识。
TCP flag
TCP flag
示意TCP
标记位,次要介绍两个ACK
和SYN
:
SYN
同步序号,用于建设连贯过程。ACK
确认序号标识,标识示意发送信息已确认接管。
Windows Size
TCP
应用滑动窗口
来实现流量管制
,依据窗口大小,确认要发送数据包的个数。
TCP 三次握手
TCP
三次握手,是指建设一个TCP
连贯时,须要客户端和服务器总共发送3
个包。三次握手的目标是连贯服务指定端口,建设 TCP 连贯,并确认
连贯单方的序列号
和确认号
,确认TCP
窗口大小信息。
三次握手详解:
第一次握手
SYN=1,seq=x
- 客户端发送一个
TCP
的SYN
标记位为1
的包,指定客户端连贯的服务器端口,初始序列号seq
为x
。发送结束之后客户端进入SYN_SEND
。
- 客户端发送一个
第二次握手
SYN=1,ACK=1,seq=y,ACKnum=x+1
- 服务器发回确认包
ACK
应答。即SYN
标记位和ACK
标记位均为1。服务器端发送序列号seq
为y
,同时将确认序号ackNum
设置为客户端的序列号seq+1
,ackNum
示意要下次要发送数据包序列号的起始值。发送结束后,服务端进入SYN_SEND
状态。
- 服务器发回确认包
第三次握手
ACK=1,ACKnum=y+1
- 客户端再次发送确认包
ACK
,ACK 标记位为1
,并且把服务器发来的ackNum
作为起始序号seq
发送给服务端,确认号ackNum
为服务端发送的序列号+1
也就是y+1
,放在确认字段中发送给对方, - 发送结束后,客户端进入
ESTABLISHED
状态,当服务器端接管到这个包时,也进入ESTABLISHED
状态,开始数据传输。
- 客户端再次发送确认包
wireshake 抓包
为了更好了解三次握手,应用wireshakej进行抓包。首先申请拜访链接,TCP
三次握手对应上面编号57
、63
、64
:
- 第一步:
192.168.5.150
---->47.98.202.133
[SYN] seq=0 - 第二步:
47.98.202.133
---->192.168.5.150
[SYN ACK] seq=0 ack=1 - 第三步:
192.168.3.150
---->47.98.202.133
[ACK] seq=1 ack=1
记忆口诀
那么在面试的时候应该如何记忆三次握手的流程?三次握手是为了建设连贯,其中次要是为了确认客户端和服务端的序列号seq
,那么确认序列号
就须要接管方返回序列号,来确保本人发送的序列号能胜利发送。
- 第一次握手和第二次握手
确保客户端的序列号
,所以第一次发送seq
,第二次返回ack
,当接管到返回信息,表明确认了客户端序列号
。第一次和第二次都是建设连贯过程,所以都带有SYN
标记位。而第二次返回号,所以第二次带ACK
标记位。 - 第一次发送了序号
seq
为x
,返回确认号ackNum
为x+1
,因为发送耗费了一个序号,所以ackNum
要加1
。 - 第二次握手和第三次握手是为了确保服务端的序列号,服务端发送序列号
seq
,客户端返回确认号ackNum
,值为seq+1
。第二次握手要发送序号和返回上一次的握手的确认号,所以第二次握手带有SYN
和ACK
标记位。并且要发送序列号seq
和确认号ackNum
。第三次握手是确认服务端发送序列号,所以带有标记位ACK
,返回确认号ackNum
。
为啥 TCP 须要三次握手,不是两次,四次
TCP
三次握手是为了确认单方的序列号,这就像一个发送—应答
机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。如果是两次握手,只能确认客户端的序列号,无奈确认服务端的序列号。三次握手是确认两个序列号最小的连贯次数。四次也能够,然而没有必要,须要缩小握手的次数,放慢连贯速度。
总结
本文先介绍了报文头信息,三次握手次要用到了:
- 序列号
seq
,确认号ackNum
。 TCP
标记位,SYN
同步序号,示意建设连贯过程。ACK
确认序号标识,标识示意发送信息已确认接管
- 序列号
三次握手详解:
- 第一次握手,客户端发送带有
SYN
标记位的包,带有初始化序列号x
,发送结束客户端进入SYN_SEND
状态。 - 第二次握手,服务端返回应答标记位
ACK
,并返回确认号ackNum
为x+1
,x+1
示意发送耗费了一个序列号。返回了确认号示意确认
了客户端序列号。服务端也要发送序列号y
,所以也要带有SYN
的标记位。 - 第三次握手客户端发送确认包
ackNum
为y+1
,所以带确认序号标记ACK
。建设连贯,发送序号x+1
,开始传输数据。
- 第一次握手,客户端发送带有
参考
TCP协定