一、以太网协议
整个网络数据封装如下,以下文字是由底层(MAC,Ethernet Packet)开始往上层(TCP/UDP)描述:
/******************************************************************MAC报文****************************************************************************************************/
head包括(固定18个字节)
- 发送者/源地址,6个字节
- 接收者/目标地址,6个字节
- 数据类型,6个字节
data包括(最短46字节,最长1500字节)
- 数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
mac地址:
head中包括的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
TPID: 这个类型ID是为了表示后面的数据部分封装的是什么数据,比如是arp(类型ID 0x0806)(ARP报文格式),还是IPv4(类型ID 0x0800)数据包,详细见 类型ID,如下:
表示以太类型的数据全部大于0x0800。由于历史原因,以太网II型帧与以太网帧格式相同,在以太网II型帧中表示以太类型的字段与以太网帧中表示封装长度的字段相重合。为了避免歧义,根据IEEE 802.3x-1997规定,以太网类型必须大于1536(0x0600)。该数值是根据MTU在以太网帧最大为1500(0x05DC)而定的,该字段数值小于等于1500(0x05DC)的为以太网帧,大于等于1536(0x0600)的为以太网II型帧,而处在1501~1536的数据为未定义数据。
以太类型编号 | 代表协议 |
---|---|
0x0800 | Internet Protocol version 4 (IPv4) |
0x0806 | Address Resolution Protocol (ARP) |
0x0842 | Wake-on-LAN[3] |
0x22F0 | Audio Video Transport Protocol as defined in IEEE Std 1722-2011 |
0x22F3 | IETF TRILL Protocol |
0x6003 | DECnet Phase IV |
0x8035 | Reverse Address Resolution Protocol |
0x809B | AppleTalk (Ethertalk) |
0x80F3 | AppleTalk Address Resolution Protocol (AARP) |
0x8100 | VLAN-tagged frame (IEEE 802.1Q) & Shortest Path Bridging IEEE 802.1aq[4] |
0x8137 | IPX |
0x8138 | IPX |
0x8204 | QNX Qnet |
0x86DD | Internet Protocol Version 6 (IPv6) |
0x8808 | Ethernet flow control |
0x8809 | Slow Protocols (IEEE 802.3) |
0x8819 | CobraNet |
0x8847 | MPLS unicast |
0x8848 | MPLS multicast |
0x8863 | PPPoE Discovery Stage |
0x8864 | PPPoE Session Stage |
0x8870 | Jumbo Frames[2] |
0x887B | HomePlug 1.0 MME |
0x888E | EAP over LAN (IEEE 802.1X) |
0x8892 | PROFINET Protocol |
0x889A | HyperSCSI (SCSI over Ethernet) |
0x88A2 | ATA over Ethernet |
0x88A4 | EtherCAT Protocol |
0x88A8 | IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag) |
0x88AB | Ethernet Powerlink[来源请求] |
0x88CC | 链路层发现协议 (LLDP) |
0x88CD | SERCOS III |
0x88E1 | HomePlug AV MME[来源请求] |
0x88E3 | Media Redundancy Protocol (IEC62439-2) |
0x88E5 | MAC security (IEEE 802.1AE) |
0x88E7 | Provider Backbone Bridges (PBB) (IEEE 802.1ah) |
0x88F7 | Precision Time Protocol (PTP) over Ethernet (IEEE 1588) |
0x8902 | IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM) |
0x8906 | Fibre Channel over Ethernet (FCoE) |
0x8914 | FCoE Initialization Protocol |
0x8915 | RDMA over Converged Ethernet (RoCE) |
0x892F | High-availability Seamless Redundancy (HSR) |
0x9000 | Ethernet Configuration Testing Protocol[5] |
0x9100 | VLAN-tagged (IEEE 802.1Q) frame with double tagging[6] |
注意,如果类型是VLAN(0x8100),才有后面的TCI和类型4个字节(prio_vid(2字节) 和 tpid(2字节)),否则没有。
/******************************************************************IP报文****************************************************************************************************/
原文链接:https://blog.csdn.net/qq_15559817/article/details/104477897
版本号:
占4位,就是IP协议的版本,通信双方的IP协议版本必须要达到一致,IPv4的版本就是4。
首部长度:
占四位,因为长度为四比特,所以首部长度的最大值为1111,15,又因为首部长度代表的单位长度为32个字(也就是4个字节),所以首部长度的最小值就是0101,当然,也确实如此,大部分的ip头部中首部字节都是0101.也就是5*4=20个字节,如果是最大值15的话,ip首部的最大值就是60个字节。所以,ipv4首部长度的最大值就是60。
服务类型(Type Of Service,TOS):
3位优先权字段(现已被忽略)+4位TOS字段+1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务。
16位标识:
唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值。
3位标志:
bit15:ResevedFlag 保留
bit14: DonotFlag 不分片标志
bit13:MoreFlag 有更多分片标志,1表示后面还有分包。例如接收到一包数据为1500字节的报文,MTU=1500,那第一包只能装载1480字节+20字节IP包头,这个时候,此标识为1。
13位片偏移:
结合上述 3位标志 看,如果bit13:MoreFlag = 1,则第二包偏移等于1480.第一包偏移等于0.
8位协议:
ICMP为1,TCP为6,UDP为17
生成时间TTL:
数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环。
头部校验和:
由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏.。
/******************************************************************TCP报文****************************************************************************************************/
https://blog.csdn.net/ShenDaiSun/article/details/134960302
源端口:
发送端端口号
目的端口:
接收端端口号
序号seq 4bytes:
发送字节序号
确认号ack 4bytes:
确认序号,告知发送端期望下一个的发送字节序号
数据偏移 4bits:
数据位置距离包头的大小,也即包头大小
保留 3bits:
标志9bits:
窗口 2bytes:
滑动窗口机制,接收端告诉发送端我有多少缓存可以用来接收数据,发送端则会根据此窗口数值调整发送数据数量
校验和:
紧急指针:
或者叫紧急偏移,如果有紧急数据,则紧急数据紧跟着包头,紧急偏移是紧急数据的结束位置,之后仍然是正常数据
选项:
占用 0~40 Byte,可选字段,用于传输TCP报文的附加信息,Options所有选项也都包含在校验和中。仅当 Data Offset > 5 时Options才会出现,size(Options) = (Data Offset - 5)×32
tcp的状态流程图:
https://blog.csdn.net/m0_61659911/article/details/132564412
https://www.cnblogs.com/xxs71/p/9149022.html