计算机网络——传输层(二)

传输层位于端系统中,也就是位于‘网络边缘’。传输层也有很多协议,但目前用的比较多的是UDP协议和TCP协议。

在认识UDP协议和TCP协议之前,先介绍两个概念——多路复用与多路分解

多路复用与多路分解

先对传输层有个基本了解,应用层通过套接字接口向传输层传递数据,传输层再通过网络向接收端的套接字接口传递数据。多路复用与多路分解是用来管理数据如何流向或流出套接字接口的。

当主机A中各个进程产生网络数据时,并将这些数据流向套接字接口后,传输层协议负责收集这些数据,然后将这些数据送上网络,我们称这个过程为多路复用

当主机B收到网络数据时,传输层协议负责收集这些数据,然后通过数据报文中的信息,将这些数据分别送到指定端口的进程中去,我们称这个过程为多路分解

对于UDP协议来说,主机A的端口可以理解能直接与主机B的端口打交道。发送端A产生报文,报文中指定了接收端B的IP地址和端口号,通过UDP协议,数据能直接由A的发送端口流向B的接收端口。

对于TCP协议来说,在接收端B会有一个‘欢迎套接字’,这个套接字端口会监听网络上的各个TCP请求,当某个TCP请求初次到来的时候,这个欢迎套接字端口会为这个请求自动分配一个隐式端口,我们无法知道这个端口的端口号,但确实有这么个端口被打开了。通过这个过程,发送端和接收端建立了连接,当发送端再次发送请求报文的时候,这个欢迎套接字就会将这个报文传递给之前打开的那个隐式端口。

UDP协议

UDP协议相较于TCP协议来讲,是一种快速,限制少,简单,轻量的协议,但也是有代价的。代价就是无法保证传输数据的安全,就是数据在传输过程中可能会发生丢包,在一些对数据可靠性要求比较高的场合一般不被使用。

UDP检验和

UDP检验和是用来检查数据是否发生错误的,但仅仅只是检查而已,并不能修复错误。

UDP协议将整个数据包分割成一个个16比特的二进制数据,然后对这些二进制进行求和运算,对最终结果求反码,这个反码就是检验和。举个例子来讲,16比特太多,这里简化为4比特运算,有数据0010 0001 1110。我们首先将这12位的二进制数据分割为4位的二进制数据,可以得到3个二进制数据(如果不够,可以补0),然后对这3个二进制数据进行求和:

0010+0001+1110 = 10001

我们取后4位,所有舍去最左边的1,得到结果0001,然后对其取反码,得到结果1110。
这个1110就是我们要放进UDP协议中的检验和。因为反码加原码得到的结果在各个位上都是1,所有如果接收端接收到数据并同样对数据进行拆分求和运算,然后将结果与检验和相加,如果结果出现0位,则表明数据发生了错误。
反码 + 原码 = 111…111
原码 = 码1 + 码2 + 码3 + … + 码N
=>反码 + 码1 + 码2 + 码3 + … + 码N = 111…111

TCP协议

1.三次握手
第一次握手:发送端首先发送一个不包含数据的报文,将SYN位设置为1,随机选择一个初始序号 i,这个序号指的是字节号。
第二次握手:接收端收到报文,为该请求分配端口和缓存,然后返回一个响应报文,这个响应报文的SYN位也被设置为1,确认号被设置为 i + 1, 并随机选择一个自己的初始序号 m。
第三次握手:发送端在收到响应报文后再次返回一个SYN为0,确认号为 m + 1, 序列号为 i + 1的报文。发送端和接收端之间的连接就建立了。需要注意的是,在之后的每个报文中SYN位都被设置为0。

2.流量控制
流量控制是为了不使接收端缓存发送溢出,应用程序从缓存中取出数据,而TCP会不断向缓存中加入数据,当取出比较少,而加入比较多的时候就会发送缓存溢出的情况。TCP能够检测接收端缓存空闲区的大小,从而改变发送端传入网络数据的

3.拥塞控制
如果说流量控制是为了控制传入数据的量的话,那么拥塞控制就是为了控制传入数据的速率。如果速率太快,就会在路由器缓存中发生溢出,TCP通过检测丢包来观察速率是否达到上限,如果发生了丢包,就表示数据可能在路由器缓存队列中被丢弃,这时候就要降低发送速率。反之,如果一直没有检测到丢包,TCP会逐步加大发送端的发送速率直到发生丢包为止。

猜你喜欢

转载自blog.csdn.net/weixin_43379478/article/details/83832009