tcp、udp、ip、icmp报文格式分析
TCP 、UDP 、IP、 ICMP协议报文格式分析
Tcp报文格式:
Wireshark抓包如图:
源端口/目的端口(16bit):
在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的端口标识了接收方进程。由上图可以看出在此报文中我们的源端口号是54160, 目的端口是cichlid(1377)。
序列号(32bit):
Sequence Number这个是发送序列号,用来标识从源端向目的端发送的数据字节流,它表示在这个报文端中的第一个数据字节的顺序号,序列号是32位的无符号类型,序列号表达达到2^32 - 1后又从0开始, 当建立一个新的连接时,SYN标志为1,系列号将由主机随机选择一个顺序号ISN(Initial Sequence Number)。此报文中的序列号是0x37e3d3a9如下图:
确认号(32bit):
Acknowledgment Number它包涵了发送确认一端所期望收到的下一个顺序号。因此确认序列号应当是上次成功接收到数据的顺序号加1。只有ACK标志为1时确认序号字段才有效。TCP为应用层提供全双工服务,这意味着数据能在两个方向上独立的进行传输,因此连接的两断必须要保证每个方向上的传输数据顺序。由图可以看出此报文的确认号为0xaa09ab7b。
偏移(4bit):
这里的偏移实际指的是TCP首部的长度,它用来表明TCP首部中32bit字的数目,通过它可以知道一个TCP包它的用户数据从哪里开始,这个字段占4bit,若此字段的值为1000,则说明TCP首部的长度是8 * 4 = 32字节,所以TCP首部的最大长度是该字段的值为1111 = 15, 15 * 4 =60字节。此报文我们的偏移量在0x50中,又因它占4bit,0x50等于二进制的0101 0000 所以我们的偏移量是 0101=5,所以我们的TCP报文首部长度为5* 4 = 20字节。
标志(Flags):
Reverved、Nonce、CWR、Ecn-Echo(6bit):目前没有使用,它们的值都为0,作为保留,留待以后开发新技术时使用。
URG(Urgent Pointer Field Significant):紧急指针标志,用来保证TCP连接不被中断,并且督促中间设备尽快处理这些数据
ACK(Acknowledgement Field Signigicant):确认号字段,该字段为1时表示应答字段有效,即TCP应答号将包含在TCP报文中。
PSH(Push Function): 推送功能,所谓推送功能指的是接收端在接收到数据后立即推送给应用程序,而不是在缓冲区中排队。
RST(Reset the connection): 重置连接,不过一般表示断开一个连接,
SYN(Synchronize sequence numbers):同步序列号,用来发起一个连接请求。
FIN(No more data from sender):表示发送端发送任务已经完成(即断开连接)。
窗口大小(16bit):
表示现在运行对方发送的数据量。也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,由下图可以看出该窗口允许发送65536的数据量。
校验和(16bit)
包含TCP首部和TCP数据段,这是一个强制性的字段,一定是由发送端计算和存储,由接收端进行验证。
UDP报文格式:
网络抓包如图:
由图可知源端口号(Source port)为64668,目的端口号(Destination port)为10019,用户数据报长度(Length)为136bit,校验和(checksum)为0x8e67=36455,另外存在128bytes的数据(Data)。
IP报文格式:
网络抓包如下图:
版本(Version):IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
首部长度(Header length):IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
总长度(Total Length):IP报文的总长度。报头的长度和数据部分的长度之和。此IP报文的总长度为52字节。
标识(Identification):唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。故该字段标记当前分片为第几个分片,在数据报重组时很有用。由图可知当前分片为第17919个分片。
标志(Flags):共3位。R(Reserved bit)、DF(Don’t fragment)、MF(More fragment)三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示不是最后一片,还有其他分片,为0表示这是最后一片。
片偏移(Fragment offset):该字段是与ip分片后,相应的ip片在总的ip片的位置。该字段的单位是8字节。比如,一个长度为4000字节的ip报文,到达路由器。这是超过了链路层的MTU,需要进行分片,4000字节中,20字节为包头,3980字节为数据,需要分成3个ip片(链路层MTU为1500),那么第一个分片的片偏移就是0,表示该分片在3980的第0位开始,第1479位结束。第二个ip片的片偏移为185(1480/8),表示该分片开始的位置在原来ip的第1480位,结束在2959。第三片的片偏移为370(2960/8),表示开始的时候是2960位,结束的时候在3979位。
生存时间(Time to live):IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 54,表明此数据包经过了64-54=10台路由器。
协议(Protocol):指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
首部校验和(Header checksum):计算IP头部的校验和,检查IP报头的完整性。由图中的correct可知该IP报头是完整的。
源IP地址(source):标识IP数据报的源端设备,由图可知该源IP地址为183.232.173.182
目的IP地址(destination):标识IP数据报的目的地址,由图可知该目的IP地址为172.31.116.155
Icmp报文格式:
网络抓包如图:
实验原理:ping是用来测试网络连通性的命令,一旦发出ping命令,主机会发出连续的测试数据包到网络中,在通常的情况下,主机会收到回应数据包,ping采用的是ICMP协议。
在这次实验中可以发现,日常进行的ping操作的icmp报文就只有两种,请求(request)和应答(reply)。这两个报文的type不一样,8代表请求,0代表应答;code都为0,表示为回显应答;标示符和序列号都是一样的,表示这两个报文是配对的。
数据链路层帧格式分析:
实际中,我们会发现,大多数应用程序的以太网数据包都是Ethernet II帧的,如HTTP/Telnet/FTP/SMTP/POP3等应用。其格式如图:
帧头:6个字节的目的MAC地址和6字节的源MAC地址。2字节的类型字段,表示封装在数据中的数据类型。
数据:46-1500字节的数据字段。
帧尾:4字节的帧效验序列。
抓包如图:
可见,其目的mac地址为c8:5b:76: 1d:c1:9e,源mac地址为04:f9:38:c9:6a:22,类型为0x0800指示了该帧包含了ipv4数据报,另外0x86dd表示该帧包含的是ipv6数据报,0x0806表明指示了该帧包含了ARP帧,0x8100指示了该帧包含了IEEE 802.1Q帧。
Tcp三次握手:
网络抓包:
第一次握手,客户端请求连接,此时客户端发送一个tcp,标志位为SYN,序列号为0;
第二次握手,服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1,如图
第三次握手,客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如图
Tcp四次挥手:
网络抓包:
第一次挥手,主动方发送一个FIN,用来关闭主动方到被动方的数据传送;
第二次挥手,被动方收到这个FIN,它发回一个ACK,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号;
第三次挥手,被动方关闭与主动方的连接,发送一个FIN给主动方;
第四次挥手,主动方发回ACK报文确认,并将确认序号设置为收到序号加1;被动方关闭连接。