TCP、IP、ARP、ICMP首部分析

之前整理了一些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七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、和物理层。七层模型与各个层中应用给的协议如下图所示。

TCP、IP、ARP、ICMP首部分析_第1张图片

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

TCP、IP、ARP、ICMP首部分析_第2张图片

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

    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结构。以便我们更好的分析解析出真正的数据。

TCP、IP、ARP、ICMP首部分析_第3张图片

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

2、各协议首部

  2.1以太网首部

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

TCP、IP、ARP、ICMP首部分析_第4张图片

    目标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个字节,它的结构为

TCP、IP、ARP、ICMP首部分析_第5张图片

    版本: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个字节,它的结构为

TCP、IP、ARP、ICMP首部分析_第6张图片

    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字节,它的结构为

TCP、IP、ARP、ICMP首部分析_第7张图片

    硬件类型:表示硬件地址类型,它的值为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个字节,它的结构是

TCP、IP、ARP、ICMP首部分析_第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字节,它的结构是

TCP、IP、ARP、ICMP首部分析_第9张图片

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

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

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

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

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

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

TCP、IP、ARP、ICMP首部分析_第10张图片TCP、IP、ARP、ICMP首部分析_第11张图片

    常见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



你可能感兴趣的:(C,STM32)