TCP、IP、ARP、ICMP首部分析

  • Post author:
  • Post category:其他



之前整理了一些STM32以太网应用的知识,记在笔记本上,现在把它整理到博客中,希望能对大家学习有帮助。





最近新发现的好博文,分享出来,大家一起看。



通俗大白话来理解TCP协议的三次握手和四次分手:https://github.com/jawil/blog/issues/14



我自己提炼的关于《HTTP权威指南》每章的知识点总结!:https://github.com/woai30231/http




TCP通信的三次握手和四次撒手的详细流程:https://www.cnblogs.com/cy568searchx/p/3711670.html







1、OSI模型


关于OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、和物理层。七层模型与各个层中应用给的协议如下图所示。





那么数据在各层中,使用什么协议我们通过下图列出一些常用的协议,以及对于其在各个层不同协议的判断。





几个常用的协议的功能我们通过一个形象的说法来展现


IP:I want to send data to 127.127.127.127


UDP:I want to send a datagram on the port N


TCP:I want to send data in a reliable way on the port N


ARP:who knows 127.127.127.127’s MAC address?


RARP:

who knows 21.21.12.

21.21.12

‘s IP address?



ICMP:I send or receive queries or error message



DHCP/BOOTP:I want to get an IP address



DNS:what is the IP address of www.st.com?


从网络上传来的数据。我们一层层扒去它的外层(各种协议做的封装),得到真正我们需要的数据。发送网络上的数据也是在添加完各种协议头(封装),才开始发送到网络上,下面我们来看一下网络上数据包的IP–TCP结构。以便我们更好的分析解析出真正的数据。





我们以从以太网接收数据为例进行讲解。


2、各协议首部


2.1以太网首部


我们从以太网收到数据首先看到的是以太网首部,它共有14个字节。它的结构为





目标MAC地址:6字节,将要接收网络数据包的MAC地址。如果MAC地址中第一个字节的最低有效位为0,则该地址是单播地址;如果MAC地址中的第一个字节的最低位有效位为1,则该地址是组播目标地址,带有组播目标地址的数据包将被送达一组选定的以太网节点;如果目标地址字段是保留的组播地址FF-FF-FF-FF-FF-FF,则该数据包是广播数据包,它将被发送至共享该网络的每个节点。


源MAC地址:6字节,将这个数据包发送到网络上的MAC地址。


协议类型:两字节字段,定义其后数据包属于何种协议。0800表示IP协议,0806表示ARP协议,8035表示RARP协议。另外,如果该字段被填充的数值小于等于05DCh(1500),则该字段为长度字段,指定数据字段中非填充数据的长度。


注:MAC是网卡的硬件地址,在出厂时固化,它由两部分构成,钱三字节称为组织唯一标识符(OUI),OUI有ICCC分配。后三字节有购买该OUI的公司定义的地址字节。



以太网尾部为4字节CRC校验(


帧校验序列(FCS))




.如果帧长小于64字节,则要求”填充”,以使这个帧的长度达到64字节。


2.2IP(网络协议)首部


接下来是IP首部,它共有20个字节,它的结构为





版本:4位版本号,目前应用最广泛的是4(1000),即IPv4;


头长:4位首部的长度,它以4字节为单位,最小值为5,即首部长度最小为20字节。我们上图给出的就是20字节头长,不带任何选项 的IP首部,首部的最大长度为4*15=60字节


服务类型:

8 位TOS 字段有3 个位用来指定IP 数据报的优先级(目前已经废弃不用),还有4 个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。



包裹总长:当前数据包的总长度(包括IP首部与IP数据)



重组标识:发送主机赋予的标识,每传一个IP数据报,16位标识加1,可用于分片和重新组装数据报。



标志:3位标志,



1位保留;



1位为不分段位:0表示允许数据包分段,1为不允许;



1位为更多段位:0表示数据包后面没有包,该包为最后包,1表示数据包后有更多包



段偏移量:13位段偏移量与更多段位组合,帮助接收方组合分段的报文



生存时间:PING命令看到的TTL就是这个。

每过一个路由器就把该值减1,如果减到0 就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。





协议代码:使用该包裹的上层协议。TCP是6 ICMP是1,IGMP是2,UDP是17;





头校验和:16位IP首部的校验和。





32位源IP地址与32位目的IP地址。









2.3TCP(传输控制协议)首部


最后是TCP首部,它共有20个字节,它的结构为





2字节的源端口和2字节的目的端口:用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。有时,一个IP地址和一个端口号也称为一个插口或套接字(socket) 。这个术语出现在最早的TCP规范(RFC793)中,后来它也作为表示伯克利版的编程接口 。插口对或套接字对(socket pair)(包含客户IP地址、客户端口号、服务器 IP地址和服务器端口号的四元组 )可唯一确定互联网络中每个TCP连接的双方。


数据序号:TCP为发送的每一个字节都编写一个号码,这里存储当前数据包的第一字节的序号



如果将字节流看作在两个应用程序间的单向流动,则 TCP用序号对每个字节进行计数。


确认序号:TCP告诉接受者希望它下次接收到数据包的第一字节序号。


偏移:4位偏移,类似IP表明数据包头有多少个32位;


6个标志比特:




U:URG紧急比特。当URG=1时,表明此报文端有紧急数据应尽快传送;




A:ACK确认比特。只有当ACK=1是,确认字段才有效,(TCP三次握手);




P:PSH用于通知用户一个更高的数据吞吐量被需要,如果可能数据必须以更高的速率通信;




R:RST复位比特。表明TCP连接过程中出现严重错误必须释放连接,然后重新建立连接(TCP三次握手);




S:SYN同步比特。表明这是一个连接请求或连接接收报文;




F:FIN终止比特。表明此报文段的发送端的数据已发送完毕,并要求释放连接。


窗口字段:用于控制对方发送的数据量,单位为字节。TCP连接的一段根据设置的缓冲空间大小确定自己接收窗口大小,然后通知对方以确定对方的发送窗口的上限;


包校验和:包括首部与数据两部分,在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。


紧急指针:指出在本报文段中的紧急数据的最后一个字节的序号。




2.4ARP(地址解析协议)首部


对于ARP和RARP包,在以太网首部之后直接就是ARP或RARP首部,它共有28字节,它的结构为





硬件类型:表示硬件地址类型,它的值为1即表示以太网地址。


协议类型:表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同,这是有意设计的。


硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上I P地址的ARP请求或应答来说,它们的值分别为6和4。

操作类型指出四种操作类型,它们是 ARP请求(值为1) 、ARP应答(值为2) 、RARP请求(值为3)和R ARP应答(值为4) 。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。

接下来内容就是重复的MAC与IP地址。

对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。




2.5UDP(用户数据报协议)首部


对于UDP包,在IP首部后面跟随的是UDP首部。UDP首部共8个字节,它的结构是





UDP长度:包含头部和数据部分。


校验和:覆盖UDP首部和UDP数据。


注:UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的,伪首部包含IP首部中的一些字段。


TCP有超时重传机制,UDP没有。


关于UDP伪首部的问题请看这位博友的帖子:http://blog.csdn.net/wufen_1981/article/details/1998518





2.6ICMP(网络控制报文协议)首部



ICMP是在TCP/IP协议中是IP属于同一层,但是它是封装在IP数据中的。关于ICMP首部共有8字节,它的结构是








类型:8位的报文类型,用来标识报文


代码:8位的代码用来提供有关类型的进一步信息。


校验和:16位校验和,只覆盖ICMP报文


以上4个字节是ICMP报文中不变的,针对不同ICMP功能后面的有所不同


标识符:用于表示本ICMP进程


序列号:用于判断回射应答数据包






常见ICMP报文


1响应报文(类型8或0,代码0)


我们日常用的PING就是响应请求(8)和应答(0)一台主机向一个节点发送一个类型为8的ICMP报文,若无异常,则返回类型为0的ICMP报文,说明这台主机存在


2时间戳报文(类型13和14)


请求13和应答14,用于测试两台机器之间数报来意一次的传输时间(网络上的主机一般是独立的,每台机器都有自己的当前时间。时间戳请求与应答用来查询目的主机系统当前的时间。返回值是自午夜开始到现在的毫秒数,通过这个数值来协调时间的统一。事实上因为延时,这个值是不准确的,通常采取多次测量求平均值的办法。)



关于MAC、IP与端口


MAC在局域网内必须唯一,否则将于其它主机冲突导致连接不成功。


IP与MAC一样,在局域网内要保持唯一,不能与其它主机的IP地址冲突。开发板的IP与我们电脑的IP要保持在统一网段内,即IP地址的前三段要保持一致,后面不同。







关于具体数据包操作请看下一篇博文《STM32以太网程序解析》








参考资料


http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html


http://network.51cto.com/art/201310/413853.htm


http://blog.csdn.net/hjffly/article/details/7959889


http://blog.csdn.net/fovwin/article/details/8887588


http://blog.sina.com.cn/s/blog_9a4d43d80101342n.html


http://blog.csdn.net/wufen_1981/article/details/1998518





版权声明:本文为a827415225原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。