关于tcp:字节一面说说TCP的三次握手

5次阅读

共计 2240 个字符,预计需要花费 6 分钟才能阅读完成。

上周有敌人去了字节面试,问到了 TCP 三次握手的问题,过后答复的不是很好,对于三次握手的发送的报文信息都不太熟,本文次要做一下总结和记录。

TCP全称为 Transmission Control Protocol(传输控制协议),是一种 面向连贯的、牢靠的、基于字节流 的传输层通信协议。TCP也是全双工通信协议,示意客户端能够给服务端发送音讯,服务端也能够向客户端发送音讯。

报文

TCP处于 ISO 七层模型的 传输层 ,传输层的单位是 报文,报文信息如下:

Source port 和 Destination port

其中 Source portDestination port别离代表 发送端口 接管端口 。两个不同机器上的过程通信,须要通过 端口 和 IP 协定中的 IP 标识惟一的过程。

Sequence number 和 Acknowledgment number

Sequence number示意 序列号 ,示意要发送数据的起始号,在上面的三次握手应用seq 示意,Acknowledgment number示意 确认号 ,返回确认号,示意音讯曾经接管,返回下次要发送的起始号。在上面的三次握手应用ackNum 标识。

TCP flag

TCP flag示意 TCP 标记位,次要介绍两个 ACKSYN

  • SYN同步序号,用于建设连贯过程。
  • ACK确认序号标识,标识示意发送信息已确认接管。

Windows Size

TCP应用 滑动窗口 来实现 流量管制,依据窗口大小,确认要发送数据包的个数。

TCP 三次握手

TCP三次握手,是指建设一个 TCP 连贯时,须要客户端和服务器总共发送 3 个包。三次握手的目标是连贯服务指定端口,建设 TCP 连贯,并 确认 连贯单方的 序列号 确认号 ,确认TCP 窗口大小信息。

三次握手详解:

  • 第一次握手 SYN=1,seq=x

    • 客户端发送一个 TCPSYN标记位为 1 的包,指定客户端连贯的服务器端口,初始序列号 seqx。发送结束之后客户端进入SYN_SEND
  • 第二次握手 SYN=1,ACK=1,seq=y,ACKnum=x+1

    • 服务器发回确认包 ACK 应答。即 SYN 标记位和 ACK 标记位均为 1。服务器端发送序列号 seqy, 同时将确认序号 ackNum 设置为客户端的序列号 seq+1ackNum 示意要下次要发送数据包序列号的起始值。发送结束后,服务端进入 SYN_SEND 状态。
  • 第三次握手 ACK=1,ACKnum=y+1

    • 客户端再次发送确认包 ACK,ACK 标记位为1,并且把服务器发来的ackNum 作为起始序号 seq 发送给服务端,确认号 ackNum 为服务端发送的序列号 +1 也就是y+1,放在确认字段中发送给对方,
    • 发送结束后,客户端进入 ESTABLISHED 状态,当服务器端接管到这个包时,也进入 ESTABLISHED 状态,开始数据传输。

wireshake 抓包

为了更好了解三次握手,应用 wireshakej 进行抓包。首先申请拜访链接,TCP三次握手对应上面编号576364:

  • 第一步: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 标记位。
  • 第一次发送了序号 seqx, 返回确认号 ackNumx+1, 因为发送耗费了一个序号,所以 ackNum 要加1
  • 第二次握手和第三次握手是为了确保服务端的序列号,服务端发送序列号 seq, 客户端返回确认号ackNum, 值为seq+1。第二次握手要发送序号和返回上一次的握手的确认号,所以第二次握手带有SYNACK标记位。并且要发送序列号 seq 和确认号ackNum。第三次握手是确认服务端发送序列号,所以带有标记位ACK, 返回确认号ackNum

为啥 TCP 须要三次握手,不是两次,四次

TCP三次握手是为了确认单方的序列号,这就像一个 发送—应答 机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。如果是两次握手,只能确认客户端的序列号,无奈确认服务端的序列号。三次握手是确认两个序列号最小的连贯次数。四次也能够,然而没有必要,须要缩小握手的次数,放慢连贯速度。

总结

  • 本文先介绍了报文头信息,三次握手次要用到了:

    • 序列号seq, 确认号ackNum
    • TCP标记位,SYN同步序号,示意建设连贯过程。ACK确认序号标识,标识示意发送信息已确认接管
  • 三次握手详解:

    • 第一次握手,客户端发送带有 SYN 标记位的包,带有初始化序列号 x, 发送结束客户端进入SYN_SEND 状态。
    • 第二次握手,服务端返回应答标记位 ACK,并返回确认号ackNumx+1,x+1示意发送耗费了一个序列号。返回了确认号示意 确认 了客户端序列号。服务端也要发送序列号 y, 所以也要带有SYN 的标记位。
    • 第三次握手客户端发送确认包 ackNumy+1, 所以带确认序号标记ACK。建设连贯,发送序号x+1,开始传输数据。

参考

TCP 协定

正文完
 0