网络传输层
传输层
为什么需要传输层
从 IP 层来说,通信的两端是两台主机,IP 数据报的首部标志了两台主机的 IP 地址,IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付给主机中的应用进程。但是我们通信的实体是主机里面的应用程序,因此需要有传输层将数据交给应用层。
总的来说,网络层是为主机之间的通信提供服务,而传输层则是为应用进程之间的通信提供服务。
传输层协议
前提概念:端口,复用,分用
(1)复用:指的是应用层所有的应用进程都可以通过传输层再传送到网络层,即传输层被不同的应用进程复用;
(2)分用:指的是传输层从 IP 层收到各应用进程的数据后,必须交付给指明的各个应用进程。
而要实现复用和分用,需要给应用层的每个应用进程赋予一个明确的标志。
在单个计算机中的进程是用进程标识符来标志的,但是在互联网环境下,计算机操作系统种类多,不同操作系统又使用不同格式的进程标识符,原方法行不通,必须采用一种方法使得它与特定的操作系统无关。
于是,端口
就诞生了。
两台主机进行通信时,不仅要知道对方的 IP 地址,还要知道目标主机的端口号。
端口号的分类
(1)服务端使用的端口号
熟知端口号:0-1023,把这些端口号分配给了 TCP/IP 最重要的一些应用程序,比如 HTTPS 443,HTTP 80,DNS 53等。
登记端口号:1024-49151,为没有熟知端口号的应用程序使用的,要使用这类端口号必须登记。
(2)客户端使用的端口号:49152-65535,当服务器进程收到客户进程的报文时,就知道客户进程所使用的端口号,就可以把数据发送给客户进程。通信结束后,刚刚已使用的客户端口号就会被系统回收,以便给其他客户进程使用。
UDP:用户数据报协议
在 UDP 中,通信时传输的数据称为 UDP 用户数据报。
特点
(1)无连接
(2)不可靠传输
(3)面向报文
(4)没有拥塞控制
(5)UDP 支持一对一、一对多、多对一、多对多的通信
(6)UDP 的首部开销小,只有8个字节
首部格式
(1)源端口
(2)目的端口
(3)长度
(4)检验和:检测 UDP 用户数据报在传输中是否有错,有错就丢弃。
TCP:传输控制协议
在 TCP 中,通信时传输的数据称为 TCP 报文。
特点
(1)基于连接(因此也是一对一的,因为TCP连接目前只有两个端点)
(2)每一条 TCP 连接只能有两个端点,是一对一的,TCP 连接的端点叫套接字(IP地址+端口,如:192.3.4.5:80)
(3)可靠传输(必要也要造成一些其他的开销)
(4)全双工通信
(5)面向字节流
首部格式
一个 TCP 报文段 包括分为首部和数据两部分,TCP 报文段前20个字节是固定的,后面有4n字节是根据需要而增加的选项。也就是说 TCP 首部的最小长度是20字节。
首部固定部分各字段的意义如下:
(1)源端口和目的端口:各占2字节;
(2)序号:4字节,范围是0到2^32-1,排完之后又从0开始,首部的序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号值是31,而携带的数据有100字节,这就表明该报文段的数据第一个字节序号是301,最后一个字节序号是401。
(3)确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。如发送方发送了501-700,那么确认号为701。
(4)数据偏移:占4位,该字段是指出 TCP 报文端的首部长度,由于首部中还有长度不确定的选项字段,因此数据偏移字段是有必要的。
(5)保留
(6)紧急:URG 为1时,这个是针对发送方的,表明此报文段中有紧急数据,是高优先级的数据,应该尽快传送,不用在缓存中排队,搭配紧急指针使用;
(7)确认 ACK,仅当 ACK 为1时,确认号才有效,当 ACK 为0时,确认号无效。
(8)推送:PSH 为1时,这个是针对接收方的,表明此报文段应尽快交付给应用程序,不用等缓存填满了再交付;
(9)复位:RST 为1时,表明 TCP 连接出现严重差错,必须断开连接;
(10)同步 SYN:SYN 为1时,表明这是一个连接请求;
(11)终止 FIN:用来释放连接
(12)窗口:占2字节。窗口指的是发送本报文段的一方的接收窗口,而不是发送窗口大小。窗口值作为接收方让发送方设置其发送窗口的依据。
例如,确认号为 701,窗口字段为 1000,意思是告诉发送方,前700位已正常,从701位算起,接收缓存最多还可以收纳1000个字节数据。
(13)检验和:检验是否有错;
(14)紧急指针:当 URG 为1时,才有意义,如:紧急指针为50时,指明该报文段中从数据起初部分开始,共有50个紧急数据字节数;
(15)选项
TCP 实现可靠传输
理想的传输条件有以下两个特点:
-
传输信道不产生差错。
-
不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
为了解决上述问题,才有了下列的协议
(1)停止等待协议
A给B发送数据,如果是
无差错
的情况下,A等待B确认,确认完毕之后才会发下一条数据;
如果出现差错
了,有可能是B检测出数据出错,或者是B连数据都没接收到,但无论是哪种情况的差错,B都不会通知A说数据出错了。(B只有在正常收到数据,且数据无误的情况下给A回复确认)
也就是说出错时,A不会收到任何通知,那么是如何保证传输的呢?
在停止等待协议中,A在每发送完一个分组之后就设置一个超时计时器
,如果在超时计时器到期之前收到了B的确认,那么A就认为数据已正常送达且无误,便撤销定时器;否则,就会触发A的超时重传
,即超过了定时器规定的时间还没消息,A就会重新发送原来的数据。
还有两个问题是我们还没考虑的,就是B回复A的通知,假设该通知丢失了或者迟到了,那么A没有正常收到,就会触发超时重传。
针对确认丢失的情况,因为有超时计时器,A就会重新发送数据data,此时B接收到数据之后要做两件事情,一是丢弃之前重复的数据,二是向A确认已收到数据data。(因为上一轮的确认丢失了,这一轮一定要发确认)
针对确认迟到的情况,因为有超时计时器,A也会重新发送数据data,此时A会收到重复的迟到确认,B会收到重复的数据,A收到重复的确认后什么都不做,B收到重复的数据后丢弃。
停止等待协议需要注意以下三点:
(1)A在发送完一个分组后,必须暂时保留已发送的分组分副本(在发生超时重传时使用),只有在收到相应的确认之后才能清除该副本。
(2)分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没收到确认。
(3)超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。如果该时间过长,那么通信效率会低下,如果该时间过短,那么有可能会导致数据的重复发送,造成资源浪费。
停止等待协议,采取等待确认的方式,信道信用率低
(2)连续 ARQ 协议
A给B发送数据,A维持一个发送窗口,位于窗口内的分组都可以连续发出去而不需要等待B的确认,这样就能提高信道利用率。
连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置,滑动窗口左边的就是已确认的数据。接收方B一般都是采用累积确认
的方式,不必对接收到的分组逐个发送确认,而是在收到几个分组之后,对按序到达的最后一个分组
发送确认。这就表示,这个分组之前的所有分组都已正确接收了。
累积确认有优点也有缺点,优点就是容易实现,即使确认丢失也不必重传,但缺点是不能及时向发送方反映接收方已正确收到所有分组的信息。
例如,如果发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前面两个分组发出确认。(因为协议规定发送的确认是按序到达的最后一个分组)所以发送方无法知道后面三个分组的下落,所以只好把后面三个分组都重传,这个称之为 回退N 。
在通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
(3)滑动窗口实现流量控制和拥塞控制
流量控制
目的:让发送方慢些,要汤让接送方来得及接收数据
实现:TCP 利用滑动窗口机制实现流量控制
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方发送窗口的大小,即接收窗口 rwnd (接收方通过设置确认报文段的窗口字段来将 rwnd 通知给发送方),发送方的发送窗口取接收窗口和拥塞窗口的最小值。
如果 rwnd=0 的分组丢失,那么发送方会等待接收方发来新的 rwnd ,假如接收方发过去的 rwnd 丢失了,那么 发送方会一直等,接收方也会一直等待接收方传输数据,所以就会出现类似于操作系统中的死锁,为了解决这个问题,所以需要设置超时计时器,TCP 为每一个连接设置一个计时器,只要 TCP 连接的一方收到对方的零窗口通知,就启动计时器,超过计时器的时间,发送方就会主动发送一个
零窗口探测报文段
,接收方收到之后就给出最新的窗口值,解除死锁的局面。
拥塞控制
目的:为了防止过多的数据涌入到网络中
(1)慢开始
一开始,拥塞窗口的值为1,在一段时间内呈现指数级增长, 到达了
慢开始阈值
ssthresh 后,进入拥塞避免阶段
(2)拥塞避免
拥塞避免阶段,拥塞窗口的增幅变小,每次只增加1,当网络出现丢包等现象时,说明出现了网络拥塞,此时拥塞窗口值会迅速降为1,并将下一轮的慢开始阈值设置为网络拥塞时拥塞窗口值的一半。
(3)快重传
假设 A 向 B 发送数据,A发了123456,2丢失,那么B在接收345时,也会一直发送2的确认号,当出现了3次重复的确认号时,A 就会重传 2,省下很多等待的时间,所以叫快重传。
(4)快恢复
快恢复指的是当出现网络拥塞时,不必降为1,而降为网络拥塞时拥塞窗口值的一半,重新从线性增长开阶段开始,不执行慢开始阶段。
总而言之
TCP 想要实现可靠传输,离不开以下几点:
(1)
序列号和确认应答
:TCP通过给每个数据包分配一个序列号,以及接收到数据之后对序列号进行确认应答,来保证数据的有序传输和无丢失。
(2)超时重传
:当发送方发现某个数据包未收到确认应答或者确认应答迟迟未到达时,会认为该数据包丢失或者已损坏,接收端没收到或者故意不发确认应答,会执行超时重传机制,即重新发送该数据包。
(3)流量控制
:TCP通过使用滑动窗口协议来限制发送方发送的数据量。接收方可以在确认应答中通知发送方当前可用的缓存空间大小,发送方据此控制自己的发送速度。
(4)拥塞控制
:TCP会根据网络拥塞情况自适应地调整发送数据的速率,以保证网络的稳定性和吞吐量。
部分资料参考王道考研