三. 数据封装:
①数据在高层称之为:数据单元
②到达传输层,再数据单元前封装协议头,称之为:数据段
③到达网络层,封装IP头部,称之为:数据包
④到达网络接口层,封装MAC地址,称之为:数据帧
⑤最终传输到物理介质,称之为:比特流
- 四层传输层协议:
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是:
①传输控制协议TCP(Transmission Control Protocol)
②用户数据包协议(User Datagram Protocol)
(1)TCP:
① TCP报文:
Transmission Control Protocol,传输控制协议,TCP是一种面向连接的传输层协议,提供可靠地传输服务。
注:因为存在Options选项,所以TCP头长度不固定,最小为20字节,最大为60字节
①Source Port:2Byte,源端口号
②Destination Port:2Byte,目标端口号
③Sequence Number:4Byte,序列号,在TCP传送的数据流中,每一个字节都有一个序
号,每发送一次数据包都会携带一个序列号
④Acknowledge Number:4Byte,确认序列号,如果收到对端的一个数据包,会查看包中
的序列号,并将序列号+对端ACK值的总和作为确认序列号返回给对端,表示此序列号的数据包已经收到,并期待收到下一个标识数据包的序列号是多少
⑤Header Length:头部长度
⑥Resv:6Byte,保留位,供往后应用,默认为0
⑦URG:紧急比特URG,当URG=1时,注解此报文应尽快传送,而不要按本来的列
队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
⑧ACK:确认比特ACK,默认为0,如果ACK=1时,确认序列号有效位,表明该数据包
包含确认信息
⑨PSH:急迫比特PSH,默认为0,当PSH=1时,表示通知接收端立即将数据提交给用户
进程,不要在缓存中停留,等待更多的数据
⑩RST:复位比特RST,默认为0,当RST=1时,注解呈现严重错误,必须开释连接,然
后再重建传输连接。
⑪ SYN:同步比特SYN, 当为1时,表示对端请求建立连接,TCP三次握手第一次时SYN
为1
⑫ FIN:终止比特FIN,为1时,表示数据发送完毕,请求断开连接
⑬ Window:2Byte,滑动窗口大小,,默示报文段发送方的接管窗口,单位为字节。此窗
口告诉对方,“在未收到我的确认时,你可以或许发送的数据的字节数至多此
窗口的大小。”
⑭ Checksum:校验和
⑮ Urgent Pointer:紧急指针,当URG=1时,注解此报文应尽快传送,而不要按本来的列
队次序来传送。与“URG”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
⑯ Options: 选项值,那些需要使用同步动作的程式如Telnet要处理好终端的交互模式就会使用到option来指定资料封包的大小因为telnet使用的资料封包都很少但又需要即时回应。Option的长度为0,或32bit的整倍数,如果不足则填充到满
② TCP三次握手:
a)主机A想要访问服务器A,发送SYN数据报文:
SYN位置为1
Sequence Number为a
b)服务器A收到主机发送的SYN报文后,回复ACK确认报文:
SYN位置为1、ACK位置为1
Acknowledge Number为a+1
Sequence Number为b
c)主机A收到回复后,发送ACK报文确认
ACK位置为1
Acknowledge Number为b+1
Sequence Number为a+1
③ TCP四次挥手:
a)主机A传输完数据,想要断开与服务器A的连接,会发送一个FIN、ACK报文:
Fin位置为1、ACK位置为1
Sequence Number为a
Acknowledge Number为b(为前期主机A发送的实际数据Sequence Number传输的数值+1)
注:此处的ACK置位表示前期实际的数据已经接收到
b)服务器A收到主机A发送的FIN数据包,回复ACK报文:
ACK位置为1
Acknowledge Number为 a+1
Sequence Number为b
c)如果服务器A也传输完数据,会发送一个FIN、ACK报文:
Fin位置为1、ACK位置为1
Sequence Number为b+1
Acknowledge Number为a+1
d)主机A收到服务器A的FIN数据包,发送ACK确认报文,seq为a+1,ack为b+1,(表示已收到服务器A的FIN序列号为b的数据包)
注1:为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以TCP传输是一种全双工的模式,两端的传输都是相互分开的,TCP断开也是相互独立的,它这里的ACK报文和FIN报文多数情况下都是分开发送的。
注2:为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
④ TCP可靠传输:
TCP在传输过程中使用序列号和确认号进行包的确认
a)发送端首次发送数据包,Seq序列号为一个生成数值,ACK为1(首次发送)
b)接收端接收到数据包,并希望得到下一个数据包(Seq+1),此时数据包中的的Seq为1用于确认收到发送端ACK为1的数据包,并将本端发送包的中ACK置为Seq+1,表示期待接收到下个数据包的序列号
c)发送端收到接收端的TCP确认包好,查看包中的ACK为11,表示下个包的序列号,此时发送下一个包,并将ACK变为2,表示第二次发送。
⑤ 滑动窗口机制:
滑动窗口,在TCP建立之后传输数据时,用于管理数据流控的标识符。接收端在接收数据时会建立一个缓存区,并将缓冲区的大小标识符值放于TCP头部的Window中,表示接收端目前缓存区可以接收的最大数据位多少。滑动窗口的作用用于接收端告诉发送端自己可以一次性接收的数据大小为多少。
a)主机A想服务器发起连接,传输数据给服务器A
b)服务器A回复ACK信息,同时携带窗口大小为3
c)主机A收到ACK确认信息后,发现窗口大小为3,于是连续发送窗口大小为3的容量的数据包给服务器A
d)服务器A收到数据包后,内存满,此时读取一个数据包,内存剩余为1,此时发送ACK确认,窗口大小为1
e)主机A收到后,发送窗口大小为1的数据包给服务器A
(2)UDP:
User Datagram Protocol,用户数据包协议,UDP是一种面向无连接的传输层协议,传输可靠性没有保证。当应用程序对传输可靠性不高时,但是对传输速度和延迟要求较高时,可以使用UDP协议来替代TCP协议在传输层控制数据的转发。
UDP头部仅占8Byte,传输数据时没有确认机制。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小、但是无法保障数据传输的可靠性,保证数据的完整性是依靠应用层的服务对数据提供保证的。
①Source port:源端口号
②Destination port:目标端口号
③Length:长度
④Checksum:校验和
(3)端口号:
主机使用端口号表示不同的网络服务。其中:0-1023为知名端口号;1024-65535为动态端口号
常见协议端口号:
名称 端口号
FTP TCP20(传输端口)/TCP21(控制端口)
HTTP TCP80
Telnet TCP23
SSH TCP22
HTTPS TCP443
BGP TCP179
PPTP TCP1723
TFTP UDP69
RIP UDP520
2. 三层网络层封装:
(1)IPv4包格式:
① Version:4bit,表示IP协议版本号。目前的版本号是4,即IPv4。版本号规定了数据报的格式。版本不同,其数据报格式也有所不同,如IPv6的报文结构就和IPv4的结构不同。
② IHL: 4bit,报文头长度HLEN,表示报文头长度(行数)。报文每行长度为固定4Byte,所以报文头长度以4 Byte为单位计算。除IP选项(IP Options)和填充(Padding)字段可以不存在外,其他各字段必须存在。这些必须存在的字段是5个4 Byte,共20 Byte长。因此,报文头长度值一般是5 。又由于报文头长度必须是32bit的整数倍,所以当一个含有IP选项字段的IP数据报不是32bit的整数倍时,由填充字段用0补足,由于存在Option选项,所以IHL不固定,为20到60字节
③ TOS:8bit,Type of Service,服务类型,指示对本数据报的处理方式。它主要用来指示数据报的优先权及传输类型。QoS技术就是使用此字段对数据进行标记优先级的。
④ Total Length:16bit,数据包总长度,以Byte为单位表示整个IP数据报长度,包括报文头及其携带的数据,可以表示最大值为65535,所以三层MTU最大为65535
⑤ Identifier:16bit,标识字段,是发送者赋予数据报的标识符,接收者利用这个信息和源地址判断收到的分组属于哪个数据报,以便进行重组。因此,在分片时,该域必须不加修改地复制到各分片的报文头中。
⑥ Flags:3bit,标志位,只有低两位有效。第一bit为0时表示该分片是最后一片,如果该位是1表示后面还有分片。第二bit为0时表示可以对数据报进行分片,如果该位是1表示数据报不能分片。当该位设置为1而帧长度不匹配又必须分片时,设备就会将数据报丢弃并返回错误信息。
⑦ Fragment Offset:片偏移,指示本分片数据在初始数据报数据区中的偏移量,偏移量以8 Byte为单位,重组时分片顺序由片偏移提供。
⑧ Time To Live:生存时间,简称TTL,8bit,用来控制数据报在网络中存在的时间。目前TTL的值并不代表时间,而是代表经由路由器的个数。数据报每经过一台路由器时,路由器将TTL值减1,一旦TTL=0,系统就丢弃该数据报,并返回错误信息。这样避免了路由出现环路时数据报在路由器之间无休止地循环。
⑨ Protocol:8bit,协议,表示该数据报携带的数据是由哪个上层协议封装的,也就是指示传输层的协议类型。如最常见的协议类型是TCP或UDP。
⑩ Header Checksum:16bit,头校验和,用于保证IP头数据的完整性。
⑪ Address:分为源IP地址和目的IP地址,各占32bit,表明数据的来源及其到达的76EE的地。
⑫ Padding:当IP报文头长度不是32bit的整数倍时,填充0来凑齐32bit整数倍,没有实际意义。
⑬ Data:来自第4层的数据段。
注:标识(Identification)、标志(Flags)、片偏移(Fragment Offset)这3个字段与IP报文的传输有关。IP数据报是网络层的数据单元,它需要被封装在第二层的数据帧中来传输。互联网是由各种二层规范不同的网络互联起来的产物,这些不同的网络的帧格式及帧长度各不相同。例如,以太网的帧和令牌环的帧在结构和长度上都不相同。IP数据报在某个二层网络中能够被完全封装,到另一个二层网络中就未必可以。因此,IP数据报有可能被分割,称为"分片(Fragmenting)",当数据到达目的地时还要对分片进行重组。上述3个字段正是用于对分片和重组进行控制的。
(2)IPv4地址有类分类:
A类:1-126/8 A类私网地址:10.0.0.0/8
B类:128-191/16 B类私网地址:172.16.0.0/16-172.31.255.255/16
C类:192-223/24 C类私网地址:192.168.0.0/16-192.168.255.255/24
D类:224-239(组播地址)
E类:240-255(保留实验)
其中:127.0.0.0-127.255.255.255.255位回环地址。
(2)分片:
通常要传输的IP报文的大小超过最大传输单位MTU(Maximum Transmission Unit)时就会产生IP分片情况。IP分片通常发生在网络环境中。比如说,在以太网(Ethernet)环境中可传输最大IP报文大小(MTU)为1500字节。而传输的报文大小要比1500字节(不包括以太协议的首部和尾部18个字节)大,这个时候就需要利用到分片技术,经分片后才能传输此报文。另外,使用UDP很容易导致IP分片,而很难强迫TCP发送一个需要进行分片的报文。并在IP数据包中采用identification标号、flags置位符、Fragment Offset偏移量 用来标识此分片数据包。
网络层外面还会加上数据链路层的封装,经过数据链路层封装之后,才是一个数据包最终的大小。要注意,MTU只是限制了一个数据包经过网络层的封装后,不要超过1500字节,一个数据包最终是多少,是不能一概而论的,不同的数据链路层会在“网络层1500字节”的基础上加上不同的头部,比如:以太网会在网络层的基础上加上14字节头部和4字节的FCS尾部,所以,一个以太网数据帧最终的大小是1518字节,当数据链路层为HDLC时,它会在网络层前面加上4字节的HDLC的头部和4字节的FCS校验,所以,一个HDLC链路的数据包是1508字节,当数据链路层为PPP时,它会在网络层前面加上4字节的PPP的头部和4字节的FCS校验,所以,一个PPP链路的数据包是1508字节
需要注意的是,MTU只会影响到数据发出方向,对收入的数据,是没有MTU限制的,但是,我们建议将链路两端的MTU设置为一样大小的,因为网络通讯都是有来有回的,一个大与接口MTU的数据收进来,如果又要从这个接口返回去,则入向收到的是一个完整的包,而出向会对这个数据分片,虽然不会影响通信,但这种双向数据结构不匹配的通讯模型并不是很合理。
注:三层中的Total Length为16bit,所以最大可以表示65535字节,所以三层的最大数为655535字节,二层最大表示的数为1518,所以实际数据包的大小为1518
① identification标号:16bit,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID(ipid),具有同一个ID的IP分片将会重新组装。
② flags置位符:3bit,标志着该分片后面是否还有新的分片。
③ Fragment Offset偏移量:13bit,记录了某IP片相对整个包的位置。
(3)三层MTU:
① 三层最大包长:
三层网络IPv4报文实际可表示长度为655535字节,而最大长度为1500Byte(称为MTU)
② 三层最小包长:
最小包长为46Byte,不够使用垫片填充。
注:存在最小数据包大小的原因为如果A主机发送的数据帧很小,很快完成数据帧的发送,二两台冲突主机相距很远,再主机A发送的数据帧传输到B的前一刻,B开始发送数据帧,这样,当A的数据帧到达B时,B检测到冲突,于是发送冲突信号。假如B的冲突信号传输到A之前,A的数据帧已经发送完毕,那么A将检测不到冲突而误认为已发送成功,因此必须有最小包长的限制。当一个包不足64Byte(数据封装到二层时)时,将使用bit填充数据部分到64Byte。
(4)协议号:
网络层数据包的包格式里面有个很重要的字段叫做协议号,协议号是存在于IP数据报的首部的20字节的固定部分,占有8bit.该字段是指出此数据报所携带的是数据是使用何种协议,以便目的主机的IP层知道将数据部分上交给哪个处理过程。也就是协议字段告诉IP层应当如何交付数据。
协议号用于表示三层网络层上层为何种网络协议。
常见协议号:
协议名称 协议号
ICMP 1
IGMP 2
TCP 6
EGP 8
IGP 9
UDP 17
IPv6 41
GRE 47
NARP 54
OSPF 89
VRRP 112
L2TP 115
3. 二层数据帧封装:
数据帧封装分为两种帧格式封装,一种为Ethernet_II定义格式;一种为IEEE802.3定义格式。
注:如何区分数据包使用哪种格式:
① 当数据包的长度大于或等于1536Byte时为Ethernet_II协议封装。
② 当数据报的长度小于或等于1500Byte时为IEEE802.3协议封装。
(1)Etherne_II帧格式:
① 6Byte的目标MAC地址
② 6Byte的源MAC地址
③ 2Byte的Type类型(0x0800为IP;0x0806为ARP;0x8847为MPLS)
④ 46Byte-1500Byte的Data
⑤ 4Byte的FCS校验
(2)IEEE802.3帧格式:
① 6Byte的目标MAC地址
② 6Byte的源MAC地址
③ 2Byte的Length长度表示符
④ 3Byte的LLC链路控制子层:
a)1Byte的D.SAP
b)1Byte的S.SAP
⑤ 5Byte的S.NASP
a)3Byte的Org Code
b)2Byte的Type
⑥ 38Byte—1492Byte的Data数据
⑦ 4Byte的FCS校验位
注:IEEE802.3帧长度值小于等于1500
IEEE802.3数据帧抓包:
(3)二层MTU:
在Ethernet_II封装数据帧中:
数据帧最小为64Byte:
46Byte的数据单元+2Byte的Type+6Byte的D_MAC+6Byte的S_MAC+4Byte的FCS校验位
数据帧最大为1518Byte:
1500Byte的数据单元+2Byte的Type+6Byte的D_MAC+6Byte的S_MAC+4Byte的FCS校验位
(4)Type标识:
Type类型 Type标识
IPv4 0x0800
IPv6 0x86DD
ARP 0x0806
MPLS 0x8847
802.1Q 0x8100