掘金 阅读 ( ) • 2024-07-01 10:50

传输层:

从网络层我们知道,数据在网络层中可以找到目的主机,但是当数据进入主机之后,又是怎么传递的呢?这里这就是传输层要研究的内容了!!!

一、传输层解决了什么问题?

传输层最最最最最核心的解决的问题上:将网络层的传来的数据(IP数据报),提取其数据部分,成为UDP报文或TCP报文,在发送给相应的应用进程。

当然,问题来了:怎么找到相应的进程,什么是UDP,什么是TCP?

下面我们从传输层的功能先做一个概述:看不懂没关系,有印象即可,主要是为了上面3个问题服务的补充知识:

二、传输层有什么功能?

1、提供进程与进程之间的逻辑通信;

2、复用,分用;

3、差错检测。

下面我们就从这3个功能具体展讲讲:

1)提供进程与进程之间的逻辑通信:

  • 什么是逻辑通信:

    主机A的进程1 和 主机B的进程2,想要进行通信,实际上要通过一系列的封装,解封装;但有了传输层,让其两个进程之间的通信好像是直线通信的一样,故称为逻辑通信;

当然了,这种逻辑通信也要遵守相应的协议,如UDP协议,TCP协议。后文会具体展开讲解。

2)复用,分用:

这里需要主要网络层和传输层的分用和复用是指不一样的:

网络层的复用:发送方不同协议的数据都可以封装成IP数据报发送出去;

网络层的分用:接收方在网络层剥去首部后把数据交付给相应的协议;

传输层的复用:发送方的不同进程都可以使用同一传输层协议;

传输层的分用:接收方收到数据后能正确交付到目的进程。

3)差错检测:

网络层的差错检测是指检测IP数据报的首部,而传输层的差错检测会检查整个UDP或TCP;

三、怎么找到应用进程:

当数据从网络层传到传输层时,通过端口来找到对应的进程。

问题来了,什么是端口:端口能够让应用层的各个应用知道将数据通过端口向下传递给传输层,也能够让传输层知道从网络层收来的数据要交付给应用层的哪个进程。端口的作用类似于MAC地址在数据链路层的作用,也类似于IP地址在网络层的作用。

端口号分为:

1、服务端使用的端口:

服务端使用的端口又分为熟知端口和登记端口

熟知端口:0-1023,派给TCP/IP体系下的重要的应用程序;

登记端口:1024-49151,要使用这类端口必须登记,防止重复;

2、客户端使用的端口49152-65535:

客户端启动应用程序时选择(故又称为短暂端口号)当该应用程序关闭后,这个端口号不复存在。

这里补充一个小的概念Socket:也叫套接字,Socket由“IP地址:端口”组成,用来表示网络中的某台主机和其上的某个进程。

四、UDP是什么:

UDP和TCP是传输层的传输单元,它在IP数据报的基础上增加了两个基本的服务:1、复用和分用,2、差错检测;简单的理解就是1、网络层只能找到主机,传输层能准确的找到应用程序,2、网络层的差错检测只检测IP的首部,传输层的差错检测检查的是整个UDP。

1、UDP的格式:

(我们只了解UDP的首部,数据部分没必要了解)

这里要注意的是,图中有个伪首部,是用来进行差错检测用的。具体差错检测过程:

1、在UDP前加一个12字节的伪首部,并将该UDP的“校验和”字段置全0;

2、将处理好的UDP分成以2字节大小的片段组成(不够补0),将这些片段进行二进制反码运算求和;

3、将上一步计算得到的16位二进制数替代刚刚“校验和”的全0;

4、之后去掉伪首部,将该UDP向下传递;

5、接收方收到UDP后,加上伪首部,按同样的方法进行验证,结果为1说明没有出差错。

显然我们看到,伪首部不会向上层,或者向下层传递,它只是在要校验的时候加上而已!!!!!

2、UDP协议提供的优点:

1)无连接服务:进行UDP通信时无须事先建立连接,这样做的优点是时延小。

2)分组头部开销小:UDP头部只有8字节,而TCP头部有20字节;

3)支持一对一,一对多,多对一,多对多的交互通信。(TCP只支持一对一)

综上:UDP适合一些要求时延小,传输数据较少的网络应用:如DNS,SNMP等。

总结UDP:

了解UDP是无连接服务,还有UDP报文首部的4个字段是什么意思就行了,传输层的重点是下面TCP。

五、TCP是什么:

TCP是和UDP对应的同款产品。TCP协议是传输层的重中之重!!!!

学习TCP,首先要对TCP报文的格式有一个认识,之后学习TCP协议的4大特点:1、面向连接(3次握手,4次挥手);2、可靠传输;3、流量控制;4、拥塞控制;这样就可以对TCP协议有一个全面的认识

1、TCP报文的格式:

TCP报文由首部➕数据部分组成,首部分为:20字节的固定首部和选项,填充

1)序号seq:本报文段数据部分的第一个字节的序号,显然,由固定部分20字节,和seq,可以得出“选项➕填充”字段的大小;

2)确认号ack:希望收到下一个TCP报文段(首部) 的第一个字节;

3)数据偏移:指出该TCP报文数据部分的起始 距离 TCP的起始 的距离;       也就是首部长度(固定首部20B+选项+填充),长度是4位,单位4B;所以TCP的首部长度最大位15*4B=60B,最小为20B(固定首部)。

4)URG、ACK、PSH、RST、SYN、FIN:

  • 保留位URG:URG=1时说明该TCP需要紧急处理,会优先发送出去;
  • 确认位ACK:ACK=1时,确认号ack才有效;
  • 推送位PSH:PSH=1时,说明TCP能在接收方的缓存里插队,会尽快提交给应用程序;
  • 复位RST:RST=1时,表明TCP连接中有差错,必须释放连接,重新连接;
  • 同步位SYN:SYN=1时,表明这个一个连接请求/连接接收报文;
  • 终止位FIN:FIN=1时,表明报文发送完,要求释放连接;

5)窗口:指接收窗口的大小,占16位,所以接收窗口大小为0-2^16-1;

6)校验和:与UDP类似;

7)填充:保证TCP首部是4B的整数倍。

上面所提到的这些TCP首部字段是需要记住的,可以结合下面的TCP的连接与释放来记忆:

2、TCP的连接(三次握手):

TCP连接是采用客户服务器方式的,TCP连接就是著名的“三次握手”!!!!!!

“第一握”:客户端发送连接请求(这时的TCP报文没有携带应用层数据);

“第二握”:服务器为该TCP连接分配缓存和变量,并向客户端返回确认报文,允许连接;

“第三握”:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,这时可以携带应用层数据了。

其实就是反复确认的过程,没你想的那么难!!!!

补充知识:SYN攻击

由上面可以得出,建立TCP连接其实就是发送报文的过程,那么如果有有人利用“外力”,恶意发送“连接请求”报文,那么服务端就会以为是某客户端请求的连接,服务端会响应对应的报文,但这时,客户端由不对服务端发来的报文做回应,当黑客大量发送“连接请求”报文时,服务端会一直响应,可能导致服务器宕机。

解决方法:设置SYN cookie。

3、TCP的释放(四次挥手):

第一步:客户端发送连接释放报文,主动关闭该TCP连接;

第二步:服务端返回一个确认报文,这时“客户端-->服务端”这个方向的连接就已经释放,TCP连接处于半关闭状态;

第三步:服务端发送一个连接释放报文,主动关闭TCP连接;

第四步:客户端返回确认报文段,再等待2MSL后就完成整个TCP的释放;(MSL是最长报文段寿命,由时间等待计时器设置)为什么要等待2MSL呢?为了保证服务端能接收到客户端最后一次的响应,从图里看出。

六、TCP的可靠传输:

TCP实现可靠传输的方式有4种:

1、通过“校验和”字段校验,和UDP类似;

2、序号:对每个字节编序号,从0开始,保证TCP不丢失;

3、确认:使用累计确认方式(数据链路层有讲);

4、重传:

  • 超时重传:TCP采用自适应算法,动态计算重传时间RTTs(加权平均往返时间);
  • 快速重传:类似于后退N帧协议(BGN);
  • 选择重传:SR

注意:TCP不使用停止-等待协议;

七、流量控制:

采用滑动窗口机制,这里与数据链路层的类似:主机返回ACK确认时,向对方通知自己的接受窗口rwnd,以便对方能自己调节发送窗口。

但是,这里比数据链路层多了一个拥塞窗口cwnd:也就是整个网络能允许的最大窗口。

补充:这里有个死锁的情况:假设A发送数据给B:

当B告诉A 自己的rwnd为0后,A处于等待状态,之后当B重新告诉A自己的rwnd已经不为0了,这个报文丢失,这时A还是一直等待,但是B也不知道这个报文丢失了,故A在等B的通知,B也在等A的数据,出现“死锁”;

解决方法:

只要一方收到另一方rwnd=0的信息后,TCP开启持续计时器,若持续计时器的时间到期,A就会给B发送零窗口探测报文段,接收方收到这个报文后会给当时的窗口值。(也就是等太久了就自己问对方的窗口值。

八:TCP的拥塞控制:

拥塞控制的意思是:防止过多的数据注入到网络中

TCP的拥塞控制有四种算法:慢开始和拥塞避免、快重传和快恢复。(可以理解为两两是一个组合)


直接上图,很明显,这里就不过多叙述:

1、慢开始和拥塞避免:

2、快重传和快恢复:

总结传输层:

当数据进入主机之后,通过UDP或TCP协议,找到自己的目的进程。其中借助Socket(IP:端口)标识这些数据,以便在网络层找到目的主机,在传输层找到目的进程。

其实没什么,就是怎么找进程而已,其中的三次握手和四次挥手是重点。面试必问的点,需要重点理解背诵!