目录
一、分组、分段、分片
1、分析:
2、图示:
3、详解:
(1)分组
(2)TCP分段
(3)IP数据报分片
二、可靠传输
1、可靠传输位于哪一层的问题?
2、可靠传输与差错检验
3、下层协议是不可靠的,如何保证可靠传输?
学习计算机网络时对几个概念有些不清楚,在此梳理一下,作者也是学生小白,欢迎指正。
广义上来说,分组是一种数据交换思想,分段,分片等是分组思想的具体应用,狭义上来讲分组应用于网络核心的分组交换中,分组指网络层分组交换技术,也称包交换。在网络层一个分组往往指一个数据报,在其它层往往代表这种思想。
由于数据链路层最大传输单元MTU和传输层最大报文段长度MSS的存在等原因,较大数据往往不能作为一个整体传输,需要分组。
(1)如果传输层采用TCP协议,会对较大的报文进行分段,每段长度不超过最大报文段长度MSS(说是报文段长度其实是数据部分长度,典型MSS为1460B,1500BMTU-20BIP首部-20BTCP首部),每一报文段加上TCP首部之后传递给网络层。采用TCP协议每个报文段长度较小,一般在网络层就不用进行分片。
所以分片一般都是对UDP传下来的数据进行的。
(2)如果传输层采用UDP协议,则不会对数据进行分段,整个报文加上UDP头部之后直接传递给网络层,由于数据链路层最大传输单元MTU的存在,采用UDP协议的数据较大时无法直接发给数据链路层,还要进行分片。
例如,在以太网中,MTU为1500B,IP数据报首部占20B,UDP头部占8B,数据部分占1472B,所以当数据部分大于1472B时就要进行分片,每一片加上IP数据报头部之后传递给链路层。
正是因为UDP不分段,所以“报文段”这个传输层传输单位放在UDP上并不严谨,有时称采用UDP传输的是“用户数据报”。请与网络层“IP数据报”区别开。
在下图中,TCP报文段首部的“序号”标识了分段的报文段序号,而UDP中没有分段,也就没有“序号”。
IP数据报首部以“标志”和“片偏移”来标识分片信息。
从狭义上来讲,在通信过程中,通信双方以分组为单位、使用存储-转发机制实现数据交互的通信方式,被称为分组交换(packet switching)。其他网络核心交换方式有报文交换、电路交换。
分组交换也称为包交换,它将用户通信的数据划分成多个更小的等长数据段,在每个数据段的前面加上必要的控制信息作为数据段的首部,每个带有首部的数据段就构成了一个分组。
每个分组通过通信链路和分组交换机(packet switch)传送,分组交换机主要有两类:路由器和链路层交换机。
从广义上来讲,应用层信息划分为报文,报文分为报文段等也可以叫分组。在有些时候易混淆,什么时候指什么使用时要注意。
TCP要进行分段/重组,就要在首部提供更多的信息来保证完成。
(1)序号(seq)
由于TCP存在分段,传输时无法保证每一段都按顺序到达,需要对每一段进行编号,接收时重组。TCP首部存在的序号字段便是对每段的一个标号。
TCP序号分为字节序号和报文段序号,字节序号是对传输中每个字节进行的编号,报文段序号采用报文段首部第一个字节的字节序号作为标号。
例如报文长度为50,000B,字节从0开始编号的话字节序号就是0~49,999,若MSS为1000B,就分为每段1000B,一共分了50个报文段,每段采用段中首字节的字节序号作为段序号,第一段序号就是0,第二段是1000,第三段是2000,以此类推。
实际上字节往往不是从0开始编号的,而是从一个初始序号 ISN(Initial Sequence Number)开始的。ISN可以理解为随机分配的(不固定为0或1可以避免黑客攻击或者之前相同端口号迟到的数据混淆),它告诉对端,自己的第一个报文段是谁!而三次握手的目的,就是为了确认彼此的初始序号。
(2)确认号(ack)
TCP首部还有确认号。
在 TCP 协议中,一般采用累积确认的方式,即每传送多个连续 TCP 段,可以只对最后一个 TCP 段进行确认。对方通过回复一个确认号,来表示确认已经接收到了哪个 TCP 段。
比如发送方发送了一个报文段序号为 301 的 TCP 段,这个段携带了 100 字节数据,则接收方应当回复的确认号是 401,它表示接收方已经收到了字节序号为 [0, 400] 的数据,现在期望你发送字节序号为 401 以及以后的数据。
参考文章:https://blog.csdn.net/q1007729991/article/details/69261780
从狭义上来讲的分组,每个数据报就是一个分组,而把一个数据报为了适合网络传输而分成多个数据报的过程称为分片,被分片后的各个IP数据报可能经过不同的路径到达目标主机。
图中第二行的标志、片偏移代表分片信息,除了这些信息以及影响到的检验和等信息之外,其他信息每一片都相同。
(1)标志:在IP数据报头部有一个叫“标志”的字段,用3位二进制数表示:
未使用是保留位;
不分片DF(Do not Fragment)标志如果被置1,则数据报在传输过程中不能被分片;
片未完MF(More Fragment)标志如果被置1,说明该数据报不是分片后的最后一个数据报,最后一个数据报的该位被置0。
(2)片偏移:IP数据报被分片后,各片数据区在原来IP数据区中的位置用13位片偏移来表示。上图中分片1的偏移为0;分片2的偏移为600;分片3的偏移为1200实际在IP地址中,由于偏移是以8个字节为单位进行计算的,因而在IP数据报中分片1的偏移是0;分片2的偏移是75;分片3的偏移是150。
参考文章:https://blog.csdn.net/wangzhen209/article/details/74453548
有些书把可靠传输放在传输层,有些放在数据链路层。经查给出的一种解释是:
早期链路质量过差,为保证数据链路层的传输质量,在数据链路层上加上可靠传输。之后链路质量较好,便将此功能放在传输层。两种说法都可以。
一般认为在传输层,部分质量不好的链路提供可靠交付功能。区别在于可靠传输是端到端,可靠交付点到点。
可靠传输保证机制更复杂,一般有超时重传、回复确认、流量控制等多种机制。
差错检验一般由CRC冗余检验,奇偶校验等检验和机制来保证。有时把差错检验也放进保障可靠性的方法中。
传输层通过可靠传输对上层负责,指上层收到的数据是无错可靠的。差错检验对本层负责,接收方收到的有可能有错。
差错检验往往伴随可靠交付使用。如果链路层只采用差错检验,发现有错就直接丢弃了。如果采用可靠交付,就可以通过确认和超时重传对出错的帧进行重传。当然对于质量好的链路不用使用可靠交付,否则是在浪费资源。
TCP协议是可靠的,UDP协议是不可靠的,IP协议是不可靠的。所以可靠传输都要由TCP来保证。TCP有:
1)面向字节流和缓存机制,2)超时重发和确认机制,3)检验和机制,4)字节编号机制,5)自动丢弃重复机制,6)流量控制
来保证可靠性。
传输层保证了两个进程之间的通信,保证交付给应用层的数据无错。下层出现问题也没有关系,自下而上传回传输层还要审核,对出现问题的数据段进行重传。
举个例子,就像两个秘书把文件交给BOSS之前先电话通气检查有没有错,这样底下跑腿邮递的人即使出错了也不至于BOSS会收到错误文件,即BOSS收到的是可靠的。
这样也可以从另一个方面理解可靠传输与差错检验:
差错检验是传递过程中每一个跑腿邮递的人收到文件后都自行检查,看是不是出现错误。
可靠传输是在交付之前两个秘书直接通话比对文件是否有误。
即可靠传输是端到端的,差错检验是点到点的。
参考文章:https://www.zhihu.com/question/39324847
传输层功能包括:
(1)进程通信;
(2)复用分用;
(3)可靠传输TCP,不可靠传输UDP;
为保证可靠传输提供功能:
(1)分段/重组 (2)缓存机制 (3)ACK确认 (4)超时重传 (5)丢弃重复(6)差错检验 (7)流量控制
网络核心交换技术有分组交换和电路交换,从发展趋势来看分组交换要更适用。
网络层功能包括:
(1)分组与分组交换
由TCP传下来的一般不用分片,一个数据段加上IP首部就叫一个分组。UDP数据大的话要分片,一个分片后加上首部叫一个分组。
按照实现方式,分组交换可以分为数据报分组交换和虚电路分组交换。
数据报交换面向无连接,独立传输,控制信息多。因特网采用的就是数据报交换。
虚电路交换面向连接,类似于电路交换。不过是“虚电路”,逻辑上的电路。交换时可以临时建立连接,交换结束再拆除。此处的面向连接是点对点的,TCP的面向连接是端对端的,在其他细节如发送顺序等上差异也大。
(2)路由 (3)网络连接复用 (4)差错检测与恢复 (5)流量控制 (6)拥塞控制 (7)分片与重组
数据链路层功能:
(1)封装成帧 (2)透明传输 (帧同步) (3)差错检验和纠正
部分容易出错的链路提供可靠交付,通过ACK确认、超时重传、流量控制来实现,与TCP可靠传输不同点在于点对点和端到端。
低比特差错链路没必要提供可靠交付,也就没有提供。
数据链路层还有逻辑链路控制子层(DLSL)和媒介访问控制子层(MAC)。个人感觉可靠交付主要发生在DLSL中。感觉MAC层的CSMA/CA协议也是一种面向连接的协议。