之前整理了一些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即表示以太网地址。
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