TCP & WireShark

TCP 协议总结

网络分层

计算机网络的各层及其协议的集合被称为网络的体系结构,按照不同的维度,其常被分为七层、五层、四层网络结构。

图片来自掘金

数据包从上到下,每经过一层就在数据包前加上该层的 Header 进行封包操作,再经过物流传输比特流,到另一台设备中再层层解包,从而取出对应的数据。数据包在每一层,都有不同的英文术语来对应,如五层模型中的数据包对应以下的名称:

层级 名称术语
应用层 HTTP Packet
传输层 TCP Segment
网络层 IP Packet
链路层 Frame
物理层 Bits

我们可以用一个公式来表示每一层协议的构成:

Packet = Protocol Header + Payload

每一层的包都可以用这个公式来表示。有了这个认知之后,对于每一层协议的学习,最后就落实到每一层 Header 的学习上了。

我们可用利用 WireShark 工具来形象地查看各层的数据:

自上而下分别对应五层模型的物理层、链路层、网络层、传输层、应用层。

TCP 协议

TCP 是一种面向连接的、可靠的基于字节流的传输层通信协议。TCP 将用户数据打包成报文段,发送给另一端,另一端对收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

TCP 的特点有:

  • TCP 是面向连接的运输层协。
  • 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的。
  • TCP 提供可靠交付的服务。
  • TCP 提供全双工通信。
  • 面向字节流。

TCP 的 Header 结构如下:

三次握手

TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在 Socket 编程中,这一过程由客户端执行 Connect 来触发。

下面是三次握手的流程图:

用 WireShake 截取三次握手的数据包如下图所示:

  • 第一次握手:客户端向服务器发送连接请求包,标志位 SYN=1,序号 seq=X

  • 第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个 SYN=1,ACK=1 的报文,设置初始序号 seq=Y,ack=X+1。

  • 第三次握手: 客户端收到服务器发来的包后检查 ack 是否正确,即 ack == X+1 。以及标志位 ACK 是否为1。若正确,客户端再次发送确认包 ACK=1,SYN=0,seq=X+1,ack=Y+1 服务器收到后确认序号值 ACK=1 则连接建立成功,可以传送数据了。

四次挥手

四次挥手即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在 Socket 编程中,这一过程由客户端或服务端任一方执行 Close 来触发。 由于 TCP 连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

下面是四次挥手的流程图:

用 WireShake 截四次挥手的数据包如下图所示:

  • 第一次挥手:客户端发送请求包,标志位 FIN=1,ACK=1,序号 seq=X,ack=Y 用来关闭客户端到服务器端的数据传送,如果服务端还有数据没有发送完成,可以继续发送数据。

  • 第二次挥手:服务端收到包后,发回一个 ACK=1,序号 seq=Y,ack=X+1。

  • 第三次挥手:服务器关闭与客户端的连接,发送一个FIN=1,ACK=1,序号 seq=Y,ack=X+1的包。

  • 第四次挥手:客户端收到包,确认 ack == X+1,发送确认包给客户端 ACK=1,序号 seq=X+1,ack=Y+1。

References

Last updated on 2023-05-03 21:44:50