网络的协议封装,主要涉及以下几个报文段:
先来说下TCP(传输控制协议)报文段:
看书是看了,但过一段时间就什么都想不起来了,看书时觉得是都明白了,但要清晰叙述出来,还要重复……,努力!
其实是很基础的东西,这里再细化一下,加强记忆。
什么是MMS??
简单来说,MSS是指数据的最大长度。
TCP首部固定为20字节+选项最大为40字节
16位端口号:标示该段报文来自哪里(源端口)以及要传给哪个上层协议或应用程序(目的端口)。进行tcp通信时,一般client是通过系统自动选择的临时端口号,而服务器一般是使用知名服务端口号或者自己指定的端口号。
16位端口号:标示该段报文来自哪里(源端口)以及要传给哪个上层协议或应用程序(目的端口)。进行tcp通信时,一般client是通过系统自动选择的临时端口号,而服务器一般是使用知名服务端口号或者自己指定的端口号。
32位序号:表示一次tcp通信过程(从建立连接到断开)过程中某一次传输方向上的字节流的每个字节的编号。假定主机A和B进行tcp通信,A传送给B一个tcp报文段中,序号值被系统初始化为某一个随机值ISN,那么在该传输方向上(从A到B),后续的所有tcp报文断中的序号值都会被设定为ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。
32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到对方的tcp报文段的序号值+1。假定主机A和B进行tcp通信,那么A发出的tcp报文段不但带有自己的序号,也包含了对B发送来的tcp报文段的确认号。反之也一样。
(首部长度)数据偏移 占4位,表示报文段的数据部分的起始位置,距离整个报文段的起始位置的距离。间接的指出首部的长度。表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit(四个字节),也就是60个字节是最大的tcp头部长度。
6位标志位:
URG:紧急指针是否有效,当URG=1,表明紧急指针字段有效,该报文段有紧急数据,应尽快发送。
ACK:表示确认好是否有效,携带ack标志的报文段也称确认报文段,仅当ACK=1时,确认号才有效,连接建立后,所有的报文段ACK都为1。
PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间
RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段,RST=1时,表明TCP连接中出现严重差错
SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段,在建立连接时用来同步序号。当SYN=1,ACK=0,则表明是一个连接请求报文段。SYN=1,ACK=1则表示对方同意连接。TCP建立连接用到。
FIN(终止)标志:表示告知对方本端要关闭连接了。用来释放一个连接窗口。当FIN=1时,表明此报文段的发送方不再发送数据,请求释放单向连接。TCP断开连接用到。
16位窗口大小:是TCP流量控制的一个手段,这里说的窗口是指接收通告窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
16为校验和:由发送端填充,校验和字段检验的范围和方法类似于UDP,包括TCP伪首部,TCP首部和应用层数据3部分。
16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。不妨称之为紧急偏移,发送紧急数据时会用到这个。
如题:2019年10月
选C ,分析见以上,首部长度部分的解释。
再如题:2017年10月
分析:
以上的TCP首部固定为20字节,IP首部多长呢?查了下,也是固定20个字节,题目说了是固字部分(所以不加选项字段长度)。
100个字节传输效率=100/(100+20+20+18)=63.29%
1000同理1000/(1000+40+18)=94.5%,所以应用层数据越长,传输效越高
注:
这里复习一下,为什么以太网帧最短为64个字节,是因为争用期,数据帧(其实就是IP数据报)的长度为(46+18)-(1500+18),也就是64-1518字节,详见《网络原理之数据链路层》。这里IP首部20+TCP首部也是20,后面的6个字节肯定是要在数据部分补上的。
编程时要注意点:
1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;
2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议, 如果分片丢失导致重组失败,将导致UDP数据包被丢弃。
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。
但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。
MSS的主要作用是限制另一端主机发送的数据的长度,同时,主机本身也控制自己发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
MTU的含义: MAC帧内的数据(Payload)字段的最大长度
传输层另一个就是UDP(用户数据报)协议:
- 源端口号。在需要对方回信时。不需要时可用全0。
- 目的端口号。这在终点交付报文时必须使用。注:源端口号和目的端口号实现了复用/分解,即在发送端分层封装数据,在接收端层层分解数据。
长度
UDP 用户数据报的长度,包括首部+数据部分,其最小值是8(仅有首部)检验和
检测 UDP 用户数据报在传输中是否有错。有错就丢弃。注:参与校验和除UDP首部,数据部分还有伪首部。这个伪首部其实就是IP首部一些字段。- UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的
伪首部
。所谓“伪首部”是因为这种伪首部并不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时用户数据报来计算的。伪首部既不向下传也不向上递交,而仅仅是为了计算检验和
如下例子:校验和步骤
UDP的校验和是把首部和数据部分一起校验,发送方计算校验和的一般步骤:
- 将首部的校验和字段填充为0(零)
- 把伪首部和用户数据报UDP看出16位的字符串连接起来(按16位对齐)
- 如果数据部分不是偶数字节,则填充一个全零字节(该字节不发送到网络层)
- 求和:按从右往左依次相加,溢出回卷的方法计算,如书上所示例子
- 然后将和写入校验和字段,就可以发送到网络层了。
接收方收到用户数据报后,连同伪首部一起,按二进制反码求这些16位字的和,无差错结果是应全为1.否则出错,直接丢弃该报文。
再往下说,就是IP数据报:
IP(Internet Protocol)是TCP/IP协议族中的核心协议,所有TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。在Internet中它是能使连接到网络上的所有设备实现相互通信的一套规则,它提供了一种尽力而为、无连接的数据报交付服务。“尽力而为”的含义是不保证IP数据报能成功到达目的地,任何可靠性必须由上层(例如TCP)提供;“无连接”意味着IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息。
固定部分
(1) 版本:占4位,指IP协议的版本。目前广泛使用的IP协议版本有两种IPv4和IPv6。
(2) 首部长度:占4位,其单位是4B。所以首部长度必须是4B的整数倍。如首部长度字段的4个二进制位分别是1111(对应十进制是15),则IP协议首部的长度是15 × 4B = 60B(字节)。由于IP数据报首部的固定部分长度固定是20,所以首部字段最小从0101开始。
(3) 区分服务(TOS字段):占8位,一般情况下不使用该字段。只有使用区分服务时,这个字段才起作用,如要求当前的数据报设置高优先级优先发送。
(4) 总长度:占16位,表示首部和数据部分长度之和,单位是字节。
(5) 标识、标志、片偏移是关于IP数据报分片的,见下文。
(6) 生存时间:占8位,表示数据报在网络中的寿命。由发送数据报的源点设置这个字段,其目的是为了防止那些无法交付的数据报无限制的在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R3,然后又转发到R1),因而白白浪费网络资源。数据报每经过一个路由器,这个值就会减1,当减至0时,就丢弃该数据报。
(7) 协议(指上层协议):占8位,协议字段是指出次数据报所携带的数据是使用的协议。这里记两个协议字段的值:6表示TCP协议,17表示UDP协议。
(8) 首部校验和:占16位,只校验数据报的首部,不检验数据部分。数据报每经过一个路由器都要重新计算一下首部校验和(一些字段,如生存时间、标志、片偏移可能发生了变化)。
(9) 源地址和目的地址:各占32位。
可变部分
(1) 可选字段:长度可变,从1字节~40字节。可变部分是为了增加IP数据报的功能,如用来支持排错、测量以及安全等措施。
(2) 填充:IP数据报的首部长度必须是4B的整数倍,所以如果首部长度不满足4B整数倍时,就使用填充字段将首部填充到4B的整数倍
数据报分片:
数据链路层将网络层传送的数据报添加头部和尾部封装成以太网帧,数据链路层封装数据帧长度是有限制的,以太网规定其最大传送单元MTU的值是1500字节,如果从网络层传输下来的数据报长度超过MUT值,就必须把过长的数据报进行分片处理。
而上节IP数据报首部固定部分的标识、标志和片偏移就是用于数据报分片的。
(1) 标识:占16位,所有分片的数据报的标识必须要和原数据报的标识相同。假如一个数据报的标识是12345,这个数据报过大,分片后将它分为3个小的数据报,这3个较小的数据报的标识也必须是12345,可以理解这3个数据报是一个家族的。相同的标识字段的值可以使分片后的各个数据报最后能正确的重装成原来的数据报。
(2) 标志:占3位,目前只有两位有意义。
1) 最低位即第3位记为MF(More Fragment),意思是是否还有更多分片。当值为1时,表示该分片不是最后一片,后面还有分片,当值为0时,表示这是原数据报分片后的最后一片数据报,后面已经没有更多的分片了。
2) 中间位即第2位记为DF(Don't Fragment),意思是原数据报能否分片。当值为1时,表示该数据报不允许分片,当值为0时,表示该数据报允许分片。
(3) 片偏移:占13位,以8B为单位。其表示较长分组分片后,某一片在原分组中的相对位置,也就是说相对于用户数据字段的起点,该片从何处开始。这也就是说,除了最后一个分片,每个分片的长度一定是8B的整数倍。
举个例子说明一下,假设一个数据报的总长度是3820个字节,其数据部分为3800字节长(首部仅仅使用固定部分),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的长度不超过1400字节。于是分为3个报片,其数据部分的长度分别为1400、1400、1000字节。原始数据报首部被复制为各个数据报的首部,但是必须修改有关字段。
对于原始数据报、数据报片1、2、3的首部部分信息如下图,(原始数据报的标识取12345)
注意区分几个字段的单位:
(1) 首部长度:单位是4B,表示数据报的首部的长度。
(2) 总长度:单位是B,标识整个数据报的长度。
(3) 片偏移量:单位是8B,表示某一分片相对于用户数据字段的起点。
又如 2019年10月:
分析:这就要求对IPv4的结构要熟悉了,第一个字节,分别是版本号和首部长度 ,可以得到首部长度为5,1个代表4个字节,所以5个代表20个字节,数据报长度字段3FCH,代表首部+数据总长,所以数据长度为3fcH-20=1020-20=1000个字节。
简单了解下IPV6
与IPV4的区别:
IPV6表示:
较之IPv4使用的32位地址,IPv6使用128位地址:
按照地址数的计算方法,我们可以计算出IPv6能够提供的地址数为:
2^128-1个(大约340万亿个)
1、冒分十六进制表示法
格式为 X:X:X:X:X:X:X:X,其中每个X代表16个bit,以十六进制显示,如下面这些:
ip一:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
2、0位压缩表示法
在某些情况下,一个IPv6地址中问可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
1080:0:0:0:8:800:200C:417A =1080::8:800:200C:417A
如何将ipv4转换为ipv6地址?
1、非标准转换:
只需要在ip地址前面6组共96位补充0即可,即
0000:0000:0000:0000:0000:0000:135.75.43.52
也就是::135.75.43.52(内嵌IPv4表示法)
2、标准转换
135.75.43.52 按十六进制算出即87.4B.2B.34,
而87.4B.2B.34串地址一组还是8位,所以需要两组v4地址合成v6地址,
再把前96位补零,它可以被转化为
0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。
如题:2019年4月
分析:用0位压缩表示法,只能出现一次::,所以B出现两次就不对了。
再往下就是以太网帧:
以太帧由一个 32 位冗余校验码结尾,用于检验数据传输是否出现损坏。以太帧结构如图所示。
上图中每个字段的含义如下表所示:
字段 | 含义 |
---|---|
前同步码 | 用来使接收端的适配器在接收 MAC 帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为 7 个字节,1 和 0 交替。 |
帧开始定界符 | 帧的起始符,为 1 个字节。前 6 位 1 和 0 交替,最后的两个连续的 1 表示告诉接收端适配器:“帧信息要来了,准备接收”。 |
目的地址 | 接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。 |
源地址 | 发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。 |
类型 | 上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。 |
数据 | 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。 在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。 |
帧检验序列 FCS | 检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。 |
注:
MAC 地址格式
硬件的 MAC 地址是厂家按照一定的规则,进行设置所产生的,因此,MAC 地址拥有自己的格式。
MAC 地址采用十六进制数表示,共 6 个字节(48 位),长度为 48bit(字节)。整个地址可以分为前 24 位和后 24 位,代表不同的含义。
- 前 24 位称为组织唯一标识符(Organizationally Unique Identifier,OUI),是由 IEEE 的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
- 后 24 位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中 MAC 地址后 24 位是不同的。
如题:2019年4月
答案:D,看以上结构