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

TCP协议

发送端应用程序通过套接字接口将数据传向传输层之后,这些数据就归传输层管了,这里就是TCP协议。TCP协议会管理一个发送缓存,所有通过套接字接口的数据会被放到这个发送缓存中去,然后TCP每次从这个缓存中拿出数据,将数据传递到网络层。其实这个过程就是多路复用

我们可以这么理解,把整个过程想象成一个快递系统,我们每家每户就相当于应用程序,当我们要寄快递的时候,我们是不是要把快递交给快递员,这里这个快递员就相应于套接字。我们的快递是通过快递员传递的吗?当然不是,快递员会把每个收集的快递包裹放到一个分发中心,然后通过物流来运输快递。这里的这个分发中心就相当于TCP协议的发送缓存。

这些发送缓存中的数据是被多次运输才最终被送走的,就像在分发中心有十几吨的货物,但我的货车最多只能运输一吨的货物,那么就只能将货物打包成一个个一吨重的包裹再通过货车进行运输。在TCP协议中也是一样,TCP每次能从发生缓存中取出数据的上限叫做最大报文长度(MSS),这个MSS由你自己主机的发送能力所决定。TCP会为每个取出的数据段加上一个TCP首部,这个TCP首部会指示这个数据的一些信息,比如要传向哪里,序列号等等。需要注意的是,MSS指的是数据段的最大长度,并不是指包括TCP首部的TCP报文段。

1.TCP报文段结构

  • 源端口号
  • 目的端口号
  • 序号
  • 确认号
  • 检验和
  • 接受窗口
  • 数据段

源端口号和目的端口号都是16比特字,也就是说端口号的长度为2^16 -1 = 65535。也就是说可用端口号是0~65535。其中0到1023是周知端口号,也就是某些特定的应用程序所要使用的,比如HTTP用的是80端口,DNS用的是53端口等等。所以一般的应用程序被分配的端口号会从1024开始分配。

序号指的是数据字节流的字节号,用Seq表示。比如数据是1000个字节,而MSS大小为100字节,则第一个报文序号为0,第二个报文序号是0+100=100,而不是0+1=1。第三个报文序号就是100+100=200了。序号指的是字节流首字节的字节号,而不是指这是第几个字节流。

确认号是主机A期望从主机B收到的下一字节的序号,用ACK表示。比如主机A已经收到序号为500的报文段,则主机A会发送一个确认号为501的响应报文,表示已经收到了500之前的所有报文段,期待收到从501开始的报文段。确认号对于TCP传输数据可靠协议来说是非常重要的。

检验和是用来检测数据是否发生损失的。

接收窗口是用来为流量控制服务的,流量控制我会在下文讲到。

数据段就是TCP从发送缓存中取出的数据。

流量控制

一条TCP连接的每一侧主机都会为该连接设置接收缓存(类比之前的发送缓存)。TCP协议将接收到的数据放到接收缓存中,需要的应用程序从该缓存中取走数据。需要注意的是,应用程序并不是每次数据一到达就立即取走,而是在自己需要的都是才去拿走数据。所以如果应用程序取走的比较少,而TCP协议接收的比较多,久而久之,这个接收缓存就会被填满,导致接收缓存发送溢出

为了避免这个情况,TCP协议提供了流量控制服务。TCP协议在报文首部增加接收窗口(rwnd)字段用来指示接收缓存中空闲区的大小。只要保证发送端发送的数据量控制在接收窗口大小之内,就不会使对方接收缓存发生溢出现象。

拥塞控制

首先我们得知道什么是拥塞,拥塞指的是网络中传输的数据达到了承载上限,有可能会导致数据丢包的发生。

我们知道网络数据的传输是经过一个个路由器的,路由器接收传入数据,通过将传入数据导向指定的数据链路。路由器会管理一个缓存队列,当从链路中导向路由器数据的速率大于路由器导出速率的时候,路由器会将多出来的数据放到缓存队列中。但这个缓存空间也是有限的,如果缓存空间已满,这时新到来一个数据。那么这个数据或者缓存队列中的某个数据就会被丢弃,从而导致丢包。

因为TCP协议是可靠的数据传输协议,所有当丢包发生的时候,TCP协议会让发生端重新发送丢失的数据包,并且降低发送速率,因为丢包的发生已经说明当前速率超过了网络承载的上限。TCP协议用拥塞窗口(cwnd)(类比之前的接收窗口)来控制发送速率。

那么如何知道丢包的发生呢?一种方法是检测超时,就是我这个数据包发送一段时间后仍未检测到确认信号,那么就说明这个数据包已经丢失。另一种情况是当我收到多个冗余确认信号时,也说明有丢包的发生。这个发送在流水线可靠传输协议的情况下。可以这么理解,主机A成功发送序号为100的报文段给主机B,主机B会反馈确认号为101的报文段给主机A,说明报文100已经收到,期待报文101。主机A接着发送序号为101的报文,这个报文在网络中发生丢包。在流水线传输协议中,主机A会继续传输接下来的报文,也就是序号为102,103…的报文,但报文数量不会超过窗口值(这个窗口值是之前设定过的)。当主机B接收到报文102时发现报文101还未送到,所以仍会发送确认信号101给主机A,并把报文102放到缓存窗口中去;同理,当主机B接收到报文103时发现报文101仍未送达,所以依然会发送确认信号101。那么对于主机A来说,它就接收到了多次相同的101确认信号,我们称之为冗余信号。主机A就会得出判断,报文101已经发生丢包。

猜你喜欢

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