实验

分析前准备

通过curl -I baidu.com 分析TCP HTTP协议

5ddc1493d6f64fd8969f774ae9c3bccb.png

在http捕捉中找到目的ip

ip.addr == 110.242.68.66(换成对应目的ip)过滤

d8dfe3decc71498aa1769ad1ff1c5b79.png

时序图

d39e69a990314233bedf5596ce21cfe2.png

以下是对每个步骤的详细解释:

  1. TCP 三次握手建立连接:

    • 数据包25: 源IP 192.168.76.18 向目标IP 110.242.68.66 发送一个TCP SYN包,请求建立连接。序列号(Seq)为0。
    • 数据包26: 目标IP 110.242.68.66 回复一个TCP SYN-ACK包,同意建立连接,并确认收到SYN包。序列号(Seq)为0,确认号(Ack)为1。
    • 数据包27: 源IP 192.168.76.18 发送一个TCP ACK包,确认收到SYN-ACK包,完成三次握手的最后步骤。
  2. HTTP 请求:

    • 数据包28: 源IP 192.168.76.18 发送一个HTTP HEAD请求到目标IP 110.242.68.66。HEAD请求用于请求获取资源的元数据,而不返回资源本身。
  3. HTTP 响应:

    • 数据包30: 目标IP 110.242.68.66 发送一个HTTP 203 OK响应到源IP 192.168.76.18。这表示请求已被处理,但返回的信息可能不完整或是一个临时响应。
  4. TCP 四次挥手关闭连接:

    • 数据包31: 源IP 192.168.76.18 发送一个TCP FIN包,请求关闭连接。序列号(Seq)为74。
    • 数据包32: 目标IP 110.242.68.66 发送一个TCP ACK包,确认收到FIN包,并发送自己的FIN包,请求关闭连接。序列号(Seq)为306。
    • 数据包33: 目标IP 110.242.68.66 发送一个TCP FIN-ACK包,确认关闭连接。
    • 数据包34: 源IP 192.168.76.18 发送一个TCP ACK包,确认收到FIN-ACK包,完成四次挥手过程,关闭TCP连接。

解释三次握手

TCP三次握手的核心目的就是确保双方的发送和接收通道都能够正常工作,以下是简化的解释:

  1. 第一次握手(SYN)

    • 客户端向服务器发送一个SYN(同步序列编号)标志位为1的TCP段,请求建立连接。这是为了告诉服务器:“我准备好了,你可以开始发送数据了。”
  2. 第二次握手(SYN + ACK)

    • 服务器收到客户端的SYN请求后,回复一个SYN+ACK包。这表示服务器已经收到客户端的SYN请求,(客户端SYN不用重发)并且服务器也准备好了:“我也准备好了,你可以开始发送数据了。”
  3. 第三次握手(ACK)

    • 客户端收到服务器的SYN+ACK响应后,发送一个ACK包作为确认。这告诉服务器:“我收到了你的准备信息,现在我们可以开始通信了。”

每一次握手都涉及到一个SYN或ACK标志位的TCP段,确保双方都能够确认对方的发送和接收能力。第一次握手确认了客户端的发送能力,第二次握手确认了服务器的接收能力,第三次握手确认了服务器的发送能力和客户端的接收能力。这样,三次握手完成后,双方都确认了对方的发送和接收能力,通道建立成功,可以开始数据传输。

详解四次挥手

在TCP/IP协议栈中,四次挥手涉及到传输层(TCP)的操作,这主要在软件层面进行,但也需要硬件层面的支持来发送和接收数据包。

  1. 第一次挥手(客户端发送FIN)

    • 软件层:客户端的TCP协议栈生成一个FIN标志位设为1的TCP段,表示客户端已经完成数据发送,并将其放入待发送队列。
  2. 第二次挥手(服务器发送ACK)

    • 软件层:服务器的TCP协议栈接收到FIN后,生成一个ACK响应,确认号为客户端FIN的序列号加1。
  3. 第三次挥手(服务器发送FIN)

    • 软件层:服务器完成数据发送后,其TCP协议栈生成一个FIN标志位设为1的TCP段,表示服务器也完成了数据发送。
  4. 第四次挥手(客户端发送最后的ACK)

    • 软件层:客户端的TCP协议栈接收到服务器的FIN后,生成一个ACK响应。

连接何时彻底关闭

在四次挥手过程中,TCP连接的彻底关闭发生在以下时刻:

  1. 服务器接收到客户端的FIN并发送ACK后服务器的接收通道在软件层面上关闭,因为服务器已经确认客户端不会再发送数据。
  2. 客户端接收到服务器的FIN并发送最后的ACK后,客户端的接收通道在软件层面上关闭,因为客户端已经确认服务器不会再发送数据。
  3. 服务器在发送FIN后进入LAST-ACK状态,等待客户端的最终ACK。一旦服务器接收到这个ACK,它的发送通道也在软件层面上关闭。
  4. 客户端在发送最后的ACK后进入TIME-WAIT状态,等待一个称为2MSL(最大报文段生存时间的两倍)的时间,以确保服务器接收到了最终的ACK。在2MSL时间后,如果客户端没有收到服务器的任何请求(因为如果服务器没有受到客户端的ASK会重发请求,如果一段时间没有请求,则默认服务器接收到了),客户端的发送通道在软件层面上关闭,此时TCP连接彻底关闭。

TCP连接的状态机

TCP连接的状态机定义了连接的不同状态,以及在收到特定的TCP标志(如FIN和ACK)时状态如何转换。以下是一些关键状态:

  • ESTABLISHED:连接已建立,双方可以发送和接收数据。
  • FIN-WAIT-1:一方已经发送FIN,等待对方的FIN。
  • FIN-WAIT-2:一方已经发送FIN并收到对方的ACK,等待对方的FIN。
  • CLOSE-WAIT:一方已经收到FIN,但还没有发送自己的FIN。
  • LAST-ACK:一方已经发送FIN并收到对方的ACK,等待自己的FIN被确认。
  • TIME-WAIT:一方已经发送FIN并收到对方的ACK,等待足够的时间以确保对方的FIN被处理。
  • CLOSED:连接完全关闭。

服务器接收通道的关闭

当服务器收到客户端的FIN并发送ACK后,服务器的接收通道在软件层面上被标记为“关闭”,意味着服务器不会再从这个通道接收新的数据。这通常意味着服务器已经将状态转换到CLOSE-WAIT状态,表明它已经准备好关闭连接,但可能还在发送最后的数据。

接收最后一个ACK

尽管服务器的接收通道被标记为“关闭”,但这并不意味着服务器的网络栈完全停止监听端口或停止处理来自客户端的TCP段。服务器仍然能够接收并处理来自客户端的TCP控制段(如ACK),因为这些控制段是连接关闭过程的一部分。

  • 服务器状态转换:服务器在CLOSE-WAIT状态时,会发送自己的FIN,然后进入LAST-ACK状态,等待客户端的最终ACK。
  • 处理ACK:即使在LAST-ACK状态,服务器的网络栈仍然能够接收并识别客户端发送的ACK。这是因为TCP协议栈需要处理这个ACK来完成连接的关闭。
  • 资源释放:一旦服务器接收到最终的ACK,它会确认连接已经完全关闭,然后释放所有相关资源,并将状态转换为CLOSED

总结来说,TCP四次挥手涉及到软件层面上的TCP协议栈操作和硬件层面上的物理传输。连接彻底关闭是在四次挥手的最后一个ACK被确认后,双方的发送和接收通道都已在软件层面上关闭。

报文详解

        ①SYN数据包25

705c21db0bbf4e509e5e5e12c20c32f3.png

 报文分层
  1. 帧信息(Frame):

    • 帧大小:66字节在线上(528位),66字节被捕获(528位)。
  2. 数据链路层(Ethernet II):

    • 源MAC地址(Src):Intel_a8:b8:5d (c0:3c:59:a8:b8:5d)
    • 目标MAC地址(Dst):3e:d1:d2:ce:e3:98
  3. 网络层(Internet Protocol Version 4, IPv4):

    • 源IP地址(Src):192.168.76.18
    • 目标IP地址(Dst):110.242.68.66
  4. 传输层(Transmission Control Protocol, TCP):

    • 源端口(Src Port):59698
    • 目标端口(Dst Port):80(通常用于HTTP服务)
    • 序列号(Seq):0,这是初始序列号,用于数据包的顺序控制。
    • 长度(Len):0,表示这个TCP段没有携带数据,仅用于控制信息。

这个数据包是一个TCP连接建立过程中的第一步,即SYN包。它由客户端(192.168.76.18)发送到服务器(110.242.68.66),用于初始化一个到服务器80端口(HTTP服务)的TCP连接。服务器需要回复一个SYN-ACK包来完成三次握手的第二步,之后客户端会发送一个ACK包来完成第三步,从而建立一个完整的TCP连接。

帧信息详解

2ba200f65fb04ecf82b9a049b4b8dcfa.png

帧信息是网络数据包在物理网络(如以太网)中传输时的封装信息:

  1. 帧大小(Frame Size):

    • 66 bytes on wire (528 bits): 表示这个帧在网络上传输时的大小是66字节,或者说528位。这是帧的实际大小。
  2. 捕获大小(Capture Size):

    • 66 bytes captured (528 bits): 表示Wireshark捕获到的帧大小也是66字节,与网络上传输的帧大小相同。
  3. 接口信息(Interface Information):

    • Interface id: 0,表示捕获这个帧的网络接口的标识符。
    • Interface name: Device\NPF_{ADCAA2BF-E174-4FEB-8CDC-A401E568AFCS},这是捕获帧的网络接口的名称,通常是一个虚拟的网络接口,用于捕获经过该接口的所有流量。
    • Interface description: WLAN,表示这个接口是一个无线局域网接口。
  4. 封装类型(Encapsulation Type):

    • Ethernet (1): 表示这个帧使用的是以太网封装,这是最常见的局域网封装类型。
  5. 到达时间(Arrival Time):

    • Dec 2, 2024 22:16:14.523449000 中国标准时间: 表示帧到达捕获设备的确切时间,按照中国标准时间(CST)。
  6. UTC到达时间(UTC Arrival Time):

    • Dec 2, 2024 14:16:14.523449000 UTC: 表示帧到达捕获设备的确切时间,按照协调世界时(UTC)。
  7. 时间戳(Epoch Arrival Time):

    • 1733148974.523449000: 表示帧到达时间的Unix时间戳,即从1970年1月1日00:00:00 UTC到当前时间经过的秒数。
  8. 时间差(Time Deltas):

    • [Time shift for this packet]: 0.000000000 seconds: 表示这个帧相对于前一个捕获的帧的时间偏移,这里是0秒,意味着它是连续捕获的。
    • [Time delta from previous captured frame]: 0.109301000 seconds: 表示这个帧与前一个捕获的帧之间的时间差,这里是0.109301秒。
    • [Time delta from previous displayed frame]: 0.000000000 seconds: 表示这个帧与前一个显示的帧之间的时间差,这里是0秒,意味着它是连续显示的。
    • [Time since reference or first frame]: 3.764436000 seconds: 表示从参考帧或第一个帧到这个帧的时间,这里是3.764436秒。
  9. 帧编号(Frame Number):

    • 25: 这是Wireshark为这个帧分配的编号。
  10. 帧长度(Frame Length):

    • 66 bytes (528 bits): 再次确认帧的大小。
  11. 捕获长度(Capture Length):

    • 66 bytes (528 bits): 表示Wireshark捕获的帧大小。
  12. 标记状态(Frame Marked/Ignored):

    • [Frame is marked: False]: 表示这个帧没有被特别标记。
    • [Frame is ignored: False]: 表示这个帧没有被忽略。
  13. 协议信息(Protocols in frame):

    • eth:ethertype:ip:tcp: 表示这个帧包含的协议栈,从数据链路层的以太网(eth),到网络层的IP,再到传输层的TCP。
  14. 着色规则(Coloring Rule):

    • [Coloring Rule Name: HTTP]: 表示这个帧根据Wireshark的着色规则被标记为HTTP流量。
    • [Coloring Rule String: http || tcp.port == 80 || http2]: 这是着色规则的具体条件,表示如果帧是HTTP流量,或者TCP端口是80(HTTP的默认端口),或者HTTP/2流量,那么这个帧将被着色。
数据链路层详解

b8718aef0754469da63aa3c456aa9b03.png

数据链路层是OSI模型的第二层,它负责在相邻节点之间传输数据帧:

  1. Ethernet II:

    • 这是以太网帧的格式,它是数据链路层的一种封装方式。
  2. 源MAC地址(Source):

    • Intel_a8:b8:5d (c0:3c:59:a8:b8:5d):这是发送数据包的设备的MAC地址。MAC地址是网络接口卡(NIC)的唯一标识符。
    • LG bit: Globally unique address (factory default):表示这个地址是全局唯一的,通常由制造商分配。
  3. 目标MAC地址(Destination):

    • 3e:d1:d2:ce:e3:98 (3e:d1:d2:ce:e3:98):这是接收数据包的设备的MAC地址。
    • LG bit: Locally administered address (this is NOT the factory default):表示这个地址是由网络管理员分配的,不是由制造商分配的默认地址。
    • IG bit: Individual address (unicast):表示这是一个单播地址,用于点对点通信。
  4. 类型(Type):

    • IPv4 (0x0800):表示这个以太网帧携带的是IPv4数据包。类型字段用于指示上层协议类型,0x0800是IPv4协议的以太网类型代码。

数据链路层的主要功能包括:

  • 帧同步:确保数据帧的开始和结束能够被接收方正确识别。
  • 物理地址寻址:使用MAC地址来标识网络中的设备。
  • 流量控制:防止快速发送方压倒慢速接收方。
  • 错误检测:通过如循环冗余检查(CRC)等方法检测帧在传输过程中的错误。
  • 访问控制:在多设备共享同一通信介质的网络中,控制设备对介质的访问。

在以太网中,数据链路层通常由网卡实现,它处理物理层的比特流,并将其转换为数据帧,以便在网络中传输。每个以太网帧都包含源MAC地址、目标MAC地址、类型字段和数据负载,以及用于错误检测的帧校验序列(FCS)。

网络层详解

8509252ca40d4a25ad7be0e46017d9eb.png

网络层,也称为互联网层,是OSI模型的第三层,主要负责在不同网络之间路由数据包:

  1. 互联网协议版本4(IPv4):

    • 这是网络层的主要协议,用于在网络中传输数据包。
  2. 版本(Version):

    • 0100 表示这是一个IPv4数据包。
  3. 头部长度(Header Length):

    • 0101 表示IP头部的长度是20字节(5个32位字=5*(4个字节))。
  4. 区分服务字段(Differentiated Services Field):

    • 0x00 表示没有特别指定的服务质量(QoS)。
  5. 总长度(Total Length):

    • 52 表示整个IP数据包的长度,包括头部和数据,是52字节。
  6. 标识符(Identification):

    • 0xa00f (4095) 用于数据包的重组。如果数据包太大,需要在目的地被分割,这个字段帮助接收方识别属于同一个原始数据包的片段。
  7. 标志(Flags):

    • 0x2 表示“Don't fragment”(不要分片)。如果设置了这个标志,数据包在传输过程中不能被分片。a01231861c7240a3a5e338d99af6a946.png
  8. 片偏移(Fragment Offset):

    • 0 表示这个数据包没有被分片,或者它是分片数据包的第一个片段。
  9. 生存时间(Time to Live, TTL):

    • 128 表示数据包在网络中可以经过的最大路由器数量。每经过一个路由器,TTL值减1,当TTL值减到0时,数据包将被丢弃。
  10. 协议(Protocol):

    • TCP (6) 表示这个IP数据包携带的是TCP协议的数据。
  11. 头部校验和(Header Checksum):

    • 0x0000 [validation disabled] 表示头部校验和没有被验证。这可能是因为Wireshark在捕获数据包时没有计算校验和。
  12. 源地址(Source Address):

    • 192.168.76.18 是发送数据包的设备的IP地址。
  13. 目标地址(Destination Address):

    • 110.242.68.66 是接收数据包的设备的IP地址。

网络层的主要功能包括:

  • 路由选择:决定数据包从源到目的地的路径。
  • 分片和重组:在需要时将大的数据包分割成更小的片段进行传输,以及在目的地重新组装这些片段。
  • 错误处理:通过TTL和其他机制处理数据包在传输过程中的丢失。
  • 负载控制:通过区分服务字段(DSCP)和ECN来控制数据包的服务质量。
传输层详解

fa04aa18b1234b71af59ba49b7ec8a72.png

传输层是OSI模型的第四层,主要负责端到端的通信和数据传输的可靠性。在您提供的截图中,传输层使用的是TCP(Transmission Control Protocol)协议。:

  1. 传输控制协议(TCP):

    显示了TCP协议的详细信息,包括源端口、目标端口、序列号、确认号、窗口大小等。
  2. 源端口(Source Port):

    59698:这是发送方的端口号,用于标识发送方的应用程序。
  3. 目标端口(Destination Port):

    80:这是接收方的端口号,通常用于HTTP服务。
  4. 序列号(Sequence Number):

    92d287590d87461e9e0c15c2cec5dd03.png0:这是TCP段的初始序列号,用于数据包的顺序控制
  5. 确认号(Acknowledgment Number):

    b61832fb9f6641e9ae5b81f1911cfc64.png0:这是接收方期望收到的下一个字节的序列号。
  6. 数据偏移(Header Length):

    5b6b95edf96943b7a4983b0c2584b873.png32 bytes (8):表示TCP头部的长度是32字节。
  7. 标志(Flags):
    74a6538ee7894b5e84007bd23ddb2de9.png0x002 (SYN):表示这是一个同步序列编号的标志,用于TCP三次握手的第一步。
  8. 窗口大小(Window):

    7405c775bf1a4cc8bde8cd95eb7c1831.png64240:表示接收方的缓冲区大小,即接收方能够接收的数据量。
  9. 校验和(Checksum):

    e2429bd13bd34d25bba424b8bfb8d214.png0xc015 [unverified]:这是TCP头部和数据的校验和,用于错误检测。
  10. Checksum Status (校验和状态):

    [Checksum Status: Unverified]: 这表明Wireshark没有验证校验和的正确性。在实际网络环境中,接收方的TCP栈会计算收到的数据包的校验和,并与这个字段中的值进行比较,以确保数据的完整性。
  11. 紧急指针(Urgent Pointer):

    063a0dba5bd14d8fa20130cd9bae9289.png0:表示没有紧急数据。
  12. 选项(Options):

    包含了TCP选项,如最大段大小(MSS)、窗口缩放因子(WS)、选择性确认(SACK)等。
    • MSS(Maximum Segment Size)1460 bytes,表示发送方愿意接收的最大TCP报文段的大小,这个选项用于指定发送方愿意接收的最大TCP段的大小。1460字节是一个常见的MSS值,它允许在以太网(Ethernet)上进行有效的传输,同时避免在大多数网络中发生分片。a338baa975224da494ea3245ff4d36bb.png
    • WS(Window Scale):这个选项用于扩大TCP窗口大小,允许更大的数据传输。Shift count为8意味着窗口大小将被放大256倍。2989a9e801744a4592041660d013d880.png
    • SACK(Selective Acknowledgment)Permitted,表示发送方允许接收方使用选择性确认。8a9dcf2afdff48bfb782fc63ec62d241.png(减少等待)
    • TCP Option - No-Operation (NOP):

      • Kind: No-Operation (1)
      • Length: 1
      • NOP选项用于填充,确保TCP选项字段的长度是32位的倍数。它不执行任何操作。
  13. 时间戳(Timestamps):

    显示了TCP时间戳信息,用于更精确的往返时间测量和重传控制。

9f1704eef7e54c6b8d54d6db81a0d4f1.png

  1. [Time since first frame in this TCP stream: 0.0000000000 seconds]:

    • 这表示从捕获的TCP流中的第一个帧到现在选中的这个帧之间的时间间隔是0秒。这通常意味着这个帧是TCP流中的第一个帧,或者Wireshark在显示这个信息时没有检测到时间差。
  2. [Time since previous frame in this TCP stream: 0.0000000000 seconds]:

    • 这表示从TCP流中的前一个帧到当前选中的帧之间的时间间隔也是0秒。这通常意味着当前帧是连续捕获的,没有时间间隔,或者Wireshark在显示这个信息时没有检测到时间差。

这些时间戳信息对于分析网络流量的时序和性能非常有用。例如,如果时间间隔不为0,它可以告诉你数据包在网络中的传输延迟,或者在网络分析中检测到的任何潜在问题,如丢包或重传。

这个TCP段是一个SYN包,用于初始化一个TCP连接。在TCP三次握手过程中,SYN包是第一步,用于同步两个节点之间的序列号。接收方会回复一个SYN-ACK包,然后发送方会发送一个ACK包来完成握手。这个过程确保了两个节点之间的连接是可靠的,并且双方都准备好了进行数据传输。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐