Wireshark与对应的OSI七层模型

wireshark 选择报文保存 wireshark报文号怎么看_socket

TCP三次握手

TCP三次握手的理论知识

wireshark 选择报文保存 wireshark报文号怎么看_wireshark_02

wireshark三次握手对应的报文情况

wireshark 选择报文保存 wireshark报文号怎么看_网络通信_03


图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包:

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图:

wireshark 选择报文保存 wireshark报文号怎么看_wireshark_04


点评:报文中有2个序列号,上面截图中写着是Seq=0,表示是相对的relative sequence number,其实真实的序列号Sequence Number(raw): 2176491452,这样写是方便阅读,后面的seq number都是基于这次的seq number来增加的。

第二次握手的数据包:

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的ISN加1以.即0+1=1, 如下图:

wireshark 选择报文保存 wireshark报文号怎么看_socket_05

第三次握手的数据包:

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:

wireshark 选择报文保存 wireshark报文号怎么看_wireshark_06

三次握手总结

第一次握手报文大小:78bytes,624bits
第二次握手报文大小:74bytes,592bits
第三次握手报文大小:66bytes,528bits

物理链路层,占用14bytes
网络层,占用20bytes
传输层,剩下的便是传输层,所以可以得到结论,第一、二、三次握手传输层占用的报文大小分别是:44bytes,40bytes,32bytes,传输层占用的报文大小是不一样的,那么该怎么知道解析到什么位置结束呢,看客有继续阅读便可知晓

TCP报文格式

如下2个图源自互联网,表示的含义相同

wireshark 选择报文保存 wireshark报文号怎么看_网络通信_07


wireshark 选择报文保存 wireshark报文号怎么看_wireshark_08

0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |       Destination Port        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Sequence Number                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Acknowledgment Number                      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Data |       |C|E|U|A|P|R|S|F|                               |
  | Offset| Rsrvd |W|C|R|C|S|S|Y|I|            Window             |
  |       |       |R|E|G|K|H|T|N|N|                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Checksum            |         Urgent Pointer        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Options                    |    Padding    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                             data                              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                           TCP Header Format
           Note that one tick mark represents one bit position.

上图中 TCP 报文中每个字段的含义如下:

  • 源端口和目的端口字段
    – TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
    – TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
  • 序列号字段
    – CP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。
    – 确认号字段
    TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
  • 数据偏移字段
    – TCP 首部长度(Header Length):标识该TCP头部有多少个32bit(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
    – 保留字段
    保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
    – 标志位字段
    — CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
    — ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
    — URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
    — ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
    — PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
    — RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
    — SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
    — FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
    – 窗口大小字段
  • 窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
  • TCP 校验和字段
    校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
  • 紧急指针字段
    紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
  • 可选项字段
    – 选项(Option):长度不定,但长度必须是 32bits 的整数倍。

总结:

  • 上面2张图片中第3行开始的第一部分,分别描述成了“Header Length(4bytes)” 和“Data Offset”,含义是相同的,都是占用4个字节,存储的值X就是对本次报文接下来长度的一个说明,这样就知道读取X字节后结束了(这里就回答了上面的问题啦)。

第一次握手数据包数据包详解

这里以上面截图的数据包(第一次握手)进行详细讲解

dc a6 32 23 35 d4 a4 83 e7 3c 3f 3d 08 00 45 00
00 40 00 00 40 00 40 06 97 e2 c0 a8 10 bf c0 a8
10 c6 f6 58 1f 91 81 ba 9f bc 00 00 00 00 b0 02
ff ff a2 0e 00 00 02 04 05 b4 01 03 03 06 01 01
08 0a 3c dc 7d da 00 00 00 00 04 02 00 00


------------------------------------------------------------------------
Ethernet Header
------------------------------------------------------------------------
dc a6 32 23 35 d4  | dst. MAC address = dc:a6:32:23:35:d4   
a4 83 e7 3c 3f 3d  | src. MAC address = a4:83:e7:3c:3f:3d
08 00              | network protocol = 0x0800 (IP)
------------------------------------------------------------------------
IP Header
------------------------------------------------------------------------
4                  | IP version = 4
5                  | header length = 5 
00                 | type of service = 0 (normal)
00 40              | length = 0x40 (decimal = 64)
00 00              | datagram identification
40 00              | don't fragment
40                 | TTL = 64
06                 | transport protocol type = 6 (TCP)
97 e2              | header checksum
c0 a8 10 bf        | source IP address = 192.168.16.191
c0 a8 10 c6        | dst IP address = 192.168.16.198
------------------------------------------------------------------------
TCP Header                  
------------------------------------------------------------------------
f6 58              | source port = 0xf658 ( decimal = 63064)  
1f 91              | dst port = 0x1f91 ( decimal = 8081)    
81 ba 9f bc        | source seqno = 0x81ba9fbc (decimal = 2176491452)   
00 00 00 00        | acknowledgment seqno = 0x00000000 (decimal = 0)   
b                  | header length =0xb (decimal = 11) , 11*4=44bytes
0                  | reserved = 0x0 (reserved data,it's must 0 now)
02                 | tcp flag = 02 (SYN)
ff ff              | window size = 0xffffff (decimal = 65535 (64kb))  
a2 0e              | tcp checknum  
00 00              | urgent pointer = 0x0000
02 04 05 b4 01 03  | option length = 24 bytes
03 06 01 01 08 0a  | 
3c dc 7d da 00 00  | 
00 00 04 02 00 00  | 
------------------------------------------------------------------------