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'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.2 IP(网络协议)首部
接下来是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.3 TCP(传输控制协议)首部
最后是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.4 ARP(地址解析协议)首部
对于ARP和RARP包,在以太网首部之后直接就是ARP或RARP首部,它共有28字节,它的结构为
硬件类型:表示硬件地址类型,它的值为1即表示以太网地址。
协议类型:表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同,这是有意设计的。
硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。
操作类型指出四种操作类型,它们是 ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4) 。这个字段必需的,因为ARP请求和RARP应答的帧类型字段值是相同的。
接下来内容就是重复的MAC与IP地址。
对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。
---------------------------------
2.5 UDP(用户数据报协议)首部
对于UDP包,在IP首部后面跟随的是UDP首部。UDP首部共8个字节,它的结构是
UDP长度:包含头部和数据部分。
校验和:覆盖UDP首部和UDP数据。
注:UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的,伪首部包含IP首部中的一些字段。TCP有超时重传机制,UDP没有。
关于UDP伪首部的问题请看这位博友的帖子:TCP&UDP伪首部详解
---------------------------------
2.6 ICMP(网络控制报文协议)首部
ICMP在TCP/IP协议中是IP属于同一层,它是封装在IP数据中的。关于ICMP首部共有8字节,它的结构是
类型:8位的报文类型,用来标识报文
代码:8位的代码用来提供有关类型的进一步信息。
校验和:16位校验和,只覆盖ICMP报文
以上4个字节是ICMP报文中不变的,针对不同ICMP功能后面的有所不同
标识符:用于表示本ICMP进程
序列号:用于判断回射应答数据包
--------------------------------------------------------------------------------------------------------------------
3、常见ICMP报文
1)响应报文(类型8或0,代码0)
我们日常用的PING就是响应请求(8)和应答(0)一台主机向一个节点发送一个类型为8的ICMP报文,若无异常,则返回类型为0的ICMP报文,说明这台主机存在
---------------------------------
2)时间戳报文(类型13和14)
请求13和应答14,用于测试两台机器之间数据报来去一次的传输时间(网络上的主机一般是独立的,每台机器都有自己的当前时间。时间戳请求与应答用来查询目的主机系统当前的时间。返回值是自午夜开始到现在的毫秒数,通过这个数值来协调时间的统一。事实上因为延时,这个值是不准确的,通常采取多次测量求平均值的办法。)
--------------------------------------------------------------------------------------------------------------------
4、关于MAC、IP与端口
MAC在局域网内必须唯一,否则将于其它主机冲突导致连接不成功。
IP与MAC一样,在局域网内要保持唯一,不能与其它主机的IP地址冲突。开发板的IP与我们电脑的IP要保持在同一网段内,即IP地址的前三段要保持一致,后面不同。
关于具体数据包操作请看下一篇博文STM32以太网程序解析一
--------------------------------------------------------------------------------------------------------------------
5、浅谈IP地址、MAC地址和地址解析协议(ARP)之间的关系
ARP地址解析协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。OSI模型把网络工作分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不直接打交道。在通过以太网发送IP数据包时,需要先封装第三层(32位IP地址)、第二层(48位MAC地址)的报头,但由于发送时只知道目标IP地址,不知道其MAC地址,又不能跨第二、三层,所以需要使用地址解析协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。
RARP协议(Reverse Address Resolution Protocol)反向地址转换协议。反向地址转换协议就是将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。
假设有两台主机,本地主机A和目标主机B要进行通信。
1)ARP映射IP地址和MAC地址的过程
图1-1是TCP/IP协议族的分层结构,数据包经常通过以太网发送,在发送数据包的过程中先封装IP的帧头信息然后再封装链路层的MAC地址,最后是以太网的帧头信息。以太网的帧头包括:目标地址、源地址、帧的类型,以太网设备的地址是48位的,它不识别32位的IP地址(IPV4)只识别MAC地址。因为以太网只识别设备的MAC地址,那么问题就来了,源地址我们是知道的就是主机A的MAC地址,那目标的MAC地址呢?我们可能知道也可能不知道。怎样得到目标的MAC地址呢?地址解析协议会完成IP地址和MAC地址之间的映射,得到主机B的MAC地址,这是地址解析协议的绝活。
首先主机A根据路由表的内容确定B主机的IP地址,然后在本主机上查询ARP缓存的ARP表看看有没有和B主机IP地址对应的MAC地址的历史记录,如果有就添加到以太网帧头的目标地址。如果在ARP表中没有与B主机IP对应的MAC地址,主机A就会向本地网络中的所有主机广播发送ARP请求帧(包含B主机的IP地址,A主机的IP地址和MAC地址),接收到ARP请求的各主机将收到的请求帧中的目标IP地址比较,如果与自己的IP地址不匹配丢弃ARP请求,如果B主机匹配B主机将自己的IP地址和MAC地址回复给发送请求的A主机,同时B主机在ARP表中更新或者记录主机A的IP地址和MAC地址。
A主机在收到数据时首先判断帧的类型,从图1-1中可以看到收到的数据可能是IP数据也可能是ARP数据。如果收到的是IP数据就会按IP的数据帧格式进行解算,如果收到的是ARP数据帧再判断是响应帧还是请求帧,如果是响应帧A主机就会更新本地的ARP表,若是请求帧就会把A主机的IP地址和MAC地址回复给发送请求的主机。
---------------------------------
2)ARP帧的格式
ARP的请求帧和响应帧有相同的格式,ARP请求帧的以太网目标地址为广播地址:FF:FF:FF:FF:FF:FF
硬件类型:ARP协议在何种网络上实现,以太网的硬件类型为1。
协议类型:使用ARP或RARP的协议类型,IPV4的值为0x0800。
硬件地址长度:物理地址长度,以太网为6
协议地址长度:协议地址长度,IPV4为4
操作代码:定义报文的类型,1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答。
发送方MAC地址:发送方的MAC地址
发送方IP地址: 发送送的IP地址
目标方MAC地址:目标方的MAC地址,当ARP是请求帧时此地址不填充。
目标放IP地址:目标方的IP地址。
因为以太网数据帧最小为46个字节,ARP帧只有28个字节所以会在ARP帧的末尾再填充18个字节的PAD数据。
--------------------------------------------------------------------------------------------------------------------
6、参考资料
http://blog.csdn.net/a827415225/article/details/51945222
-------------------------------------------------------------------------------------------------------------------
PPP工作于第2层,TCP/IP工作于3-7层
PPP(Point to Point Protocol)点对点协议
它是用于串行接口的两台计算机的通信协议,是为通过电话线连接计算机和服务器而彼此通信而制定的协议。网络服务提供商可以提供您点对点连接,这样提供商的服务器就可以响应您的请求,将您的请求接收并发送到网络上,然后将网络上的响应送回。PPP是使用IP协议,有时它被认为是TCP/IP协议族的一员。PPP协议可用于不同介质上包括双绞线,光纤和卫星传输的全双工协议,它使用HDLC进行包的装入。PPP协议既可以处理同步通信也可以处理异步通信,可以允许多个用户共享一个线路,又可发进行SLIP协议所没有的差错控制。
TCP/IP(Transmission Control Protocol/Internet Protocol)传输控制协议/Internet协议
TCP/IP协议起源于美国国防高级研究计划局。提供可靠数据传输的协议称为传输控制协议TCP,好比货物装箱单,保证数据在传输过程中不会丢失;提供无连接数据报服务的协议称为网络协议IP,好比收发货人的地址和姓名,保证数据到达指定的地点。TCP/IP协议是互联网上广泛使用的一种协议,使用TCP/IP协议的因特网等网络提供的主要服务有:电子邮件、文件传送、远程登录、网络文件系统、电视会议系统和万维网。它是Interent的基础,它提供了在广域网内的路由功能,而且使Internet上的不同主机可以互联。从概念上,它可以映射到四层:网络接口层,这一层负责在线路上传输帧并从线路上接收帧;Internet层,这一层中包括了IP协议,IP协议生成Internet数据报,进行必要的路由算法,IP协议实际上可以分为四部分:ARP,ICMP,IGMP和IP;再上向就是传输层,这一层负责管理计算机间的会话,这一层包括两个协议TCP和UDP,由应用程序的要求不同可以使用不同的协议进行通信;最后一层是应用层,就是我们熟悉的FTP,DNS,TELNET等。熟悉TCP/IP是熟悉Internet的必由之路。
UDP(User Datagram Protocol)用户数据报协议
它是定义用来在互连网络环境中提供包交换的计算机通信的协议,此协议默认认为网路协议(IP)是其下层协议。UDP是TCP的另外一种方法,象TCP一样,UDP使用IP协议来获得数据单元(叫做数据报),不象TCP的是,它不提供包(数据报)的分组和组装服务。而且,它还不提供对包的排序,这意味着,程序程序必须自己确定信息是否完全地正确地到达目的地。如果网络程序要加快处理速度,那使用UPD就比TCP要好。UDP提供两种不由IP层提供的服务,它提供端口号来区别不同用户的请求,而且可以提供奇偶校验。在OSI模式中,UDP和TCP一样处于第四层,传输层。
可以说PPP是一种连接方式,TCP、UDP是传送数据的方式
参考来自 https://yq.aliyun.com/ziliao/364865