网络抓包作业(TCP、UDP、IP、ICMP及数据链路层帧格式)———第五小组
wireshark抓包作业
抓包网址:www.cnblogs.com/
本机ip地址172.31.120.93
目的ip地址 101.37.225.65
一、分析传输层协议(TCP、UDP)的报文格式,TCP协议的连接管理
1.1 TCP报文格式
1、端口号:用来标识同一台计算机的不同的应用进程。
1)源端口:源端口和IP地址的作用是标识报文的返回地址。
2)目的端口:端口指明接收方计算机上的应用程序接口。
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
4、保留:为将来定义新的用途保留,现在一般置0。
5、控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
附:tcp抓包图
1.2 UDP报文格式
●源、目标端口号字段:占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。
●长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。
●校验和字段:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的。
附:udp抓包图
1.3 TCP协议的连接管理
TCP三次握手/建立连接
步骤1 A的TCP向B发出连接请求报文段,其首部中的同步位SYN=1,并选择序号seq=x,表明第一次传送数据时的第一个数据字节的序号是x。
步骤2 B的TCP收到连接请求报文段,如同意,则发回确认。ACK=1,其确认号ack=x+1。同时B向A发起连接请求,应使SYN=1,自己选择的序号seq=y。
步骤3 A收到此报文段后向B给出确认,其ACK=1,确认号ack=y+1。A的TCP通知上层应用进程,连接已经建立。
下面是抓包三次握手示意图
第一条TCP报文: 其中将seq设置为0 , SYN = 1 , ack = 0;
第二条TCP报文: 其中ack = 1(第一条报文中的seq+1) , SYN = 1 , 再将seq设置为1;
第三条TCP报文: ack = 1第二条报文中seq+1) ; seq =1(第一条报文中seq+1) ; SYN=0
二、分析网络层协议的报文格式(IP、ICMP)的报文格式。
2.1 IP报文格式
版本:IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
服务类型:Type Of Service。
总长度:IP报文的总长度。报头的长度和数据部分的长度之和。
标识:唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8)
生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。
协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
首部校验和:计算IP头部的校验和,检查IP报头的完整性。
源IP地址:标识IP数据报的源端设备。
目的IP地址:标识IP数据报的目的地址。
附:抓包图
2.2 ICMP的报文格式
各字段说明
1. 类型:占8位
2. 代码:占8位
3. 检验和:占16位
说明:ICMP所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。
4.标识:占2字节,用于标识本ICMP进程,但仅适用于回显请求和应答ICMP报文,对于目标不可达ICMP报文和超时ICMP报文等,该字段的值为0。
5.其它字段都ICMP报文类型不同而不同。
1> ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和。
2> 8位类型和8位代码字段一起决定了ICMP报文的类型。
类型8,代码0:表示回显请求(ping请求)。
类型0,代码0:表示回显应答(ping应答)
类型11,代码0:超时
3>16位的检验和字段:包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。
ICMP报文具体分为查询报文和差错报文(对ICMP差错报文有时需要做特殊处理,因此要对其进行区分。如:对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环)
附:Icmp抓包图
三、分析数据链路层的帧格式
数据链路层实现的三大功能分别为:
(1) 封装成帧
(2) 透明传输
(3) 差错控制
1、封装成帧
封装成帧就是在一段数据前后分别添加首部和尾部,构成了一个帧。
接收端在收到物理层上交的比特流后,能根据首部跟尾部的标记,从收到的比特流识别帧的开始和结束。
此外,首部跟尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送。各种数据链路层协议都要对帧首尾部格式有明确的规定。每一种协议都限定了帧的数据部分长度上限—–最大传输单元MTU。
附:最大传输单元MTU
一个UDP报文能传输的最大数据为多大?
以太网的数据链路层规定了最大传输单元MTU=1500(字节),那么实际上一个IP数据报最长也就是1500 字节,而IP数据报又是由UDP报文或TCP流封装得到的,那么一个UDP报文最大长度为1500-20=1480.20为IP数 据报的首部长度。而在运输层,UDP也有自己的首部(8字节),所以在应用层一个UDP报文能传递的最大数据 为1500-20-8=1472(字节)
2、透明传输
什么是透明传输,为什么需要透明传输?看下图:
解决透明传输的方法:
1、发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B)。
2、字节填充或字符填充——接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
3、如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
实现方法见下图:
3、差错检测
在传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
CRC循环冗余检测
在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
发送端执行的操作:
在发送端,先把数据划分为组。假定每组 k 个比特。
假设待传送的一组数据 M = 101001(现在 k = 6)。我们在 M 的后面再添加供差错检测用的 n 位冗余码一起发送。
冗余码计算实例:
现在 k = 6, M = 101001。
设 n = 3, 除数 P = 1101,(除数P是我们自己约定的,n的取值是 P的位数减1)
被除数是 (2^n)M = 101001000。 (对M从后开始补0,一共补n位)
模 2 运算的结果是:商 Q = 110101,(计算结果见下图)
余数 R = 001。
把余数 R 作为冗余码添加在数据 M 的后面发送出去。发送的数据是:101001001,共 (k + n) 位。
CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
接收端执行的操作:
从发送端接收到数据M:101001001(包含冗余码FCS)
发送端、接收端约定的除数 P = 1101
M%P 运算结果若为0,表示无比特差错
M%P 运算结果不为0,表示比特差错,丢弃该帧
仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受。“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
附:抓包图