图解TCP/IP-5th

内容概述: 主要讲述网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容。

第6章 TCP与UDP

TCP(Transmission Control Protocol)与UDP(User Datagram Protocol) 位于传输层
6.1 传输层的作用
  • TCP提供可靠的通信传输,UDP常被用于让广播和细节控制交给应用的通信传输
  • 6.1.1 传输层的定义
    • TODO
6.4 TCP
  • 6.4.1 TCP的特点及其目的
    • TCP通过检验和,序列号,确认应答,重发控制,连接管理以及窗口控制等机制实现可靠性传输。解决了数据的破坏,丢包,重复以及分片顺序混乱等问题。
  • 6.4.2 通过序列号与确认应答提高可靠性
    • TCP通过序列号Seq与确认应答ACK提高可靠性.
    • 丢包时重发,一段时间内发送方发出的包未收到ACK响应则进行重发。同时如果是接收端在向发送端确认应答时出现了丢包情况,此时一段时间后发送端同样收不到ACK响应,然后发送端进行重发,接收端接收到与之前相同的数据后会放弃这一次的数据。
    • 为了解决确认应答处理,重发控制以及重复控制等功能。TCP引入了序列号Seq.序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。
    • ⚠️TCP的数据长度并未写入TCP首部,实际通信中求得TCP包的长度的计算公式是IP首部中的数据包长度-IP首部长度TCP首部长度
  • 6.4.3 重发超时如何确定
    • 重发超时如何确定?每次发包时都会计算往返时间及其偏差值,将这个往返时间和偏差相加就是重发超时的时间,就是比这个总和稍大一点的值。重发超时的计算既要考虑往返时间又要考虑偏差是有其原因的,在网络环境的不同往返时间可能会产生大幅度的摇摆,之所以发生这种情况是因为数据包的分段是经过不同的线路到达的。TCP/IP的目的是即使在这种环境下也要进行控制,尽量不要浪费网络流量。BSD的Unix以及Windows系统超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的倍数,不过由于最初的数据包好不知道往返时间,所以其重发超时一般设置为6秒左右。数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答时间将会以2倍,4倍的指数函数延长。当到达一定重发次数后,若依旧没有ACK则认为网络对端主机发生异常,强制关闭连接通知应用通信异常强行中止。
  • 6.4.4 连接管理
    • TCP请求建立连接,客户端发送SYN,客户端返回ACK确认应答以及SYN请求建立连接,客户端再次发送ACK(针对服务端返回的SYN)确认应答。连接建立完成以后,接着是断开连接过程,客户端发送FIN请求断开连接,服务端返回ACK和FIN,客户端在返回ACK确认断开应答。完成建立连接->连接完成发送数据->断开连接的TCP连接的建立与断开。
  • 6.4.5 TCP以段为单位发送数据
    • TCP以段为单位发送数据,在建立TCP连接的同时,也确定发送数据包的单位,称为最大消息长度,MIS(Maximum Segment Size)最大消息长度,正好是IP中不会被分片处理的最大数据长度。这个值是在TCP建立连接的时候确定的,比如发送端建议MISS值1212,接收端建议121,则以121为准,小的值作为MISS的值发送数据
  • 6.4.6 利用窗口控制提高速度
    • 利用窗口控制提高速速,TCP以1个段为单位,每发一个段进行一次确认应答处理,这样,包的往返时间越长通信性能越低,网络吞吐越差。为解决这个问题,引入窗口控制,就是不再以段确认应答,而是以更大的单位进行确认。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制使用大量的缓冲区,通过对多个段同时进行确认应答的功能。收到确认应答后,将窗口滑动到确认应答中断的序列号位置,这样可以顺序地将多个段同时发送,提高通信性能,这种机制称为滑动窗口控制
  • 6.4.7 窗口控制与重发控制
    • 接收端在没有收到自己所期望的序列号的数据时,会对之前收到的数据进行确认应答。发送端则一旦收到某个确认应答后,又连续3次收到同样的确认应答,则认为数据段已经丢失,需要进行重发,这种机制比起超时机制可以提供更快速的重发服务。
  • 6.4.8 流控制
    • TCP提供一种机制可让发送端根据接收端的实际接收能力控制发送的数据量,这就是流控制。具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限制的数据,该大小就被称作窗口大小。当接收主机的缓冲区满的状态下,暂停接收数据,此时发送端如果过了重发超时时间还没收到窗口更新通知,为避免窗口在更新通知的传送途中丢失,导致无法继续通信。发送端会发送一个窗口探测包发送端会经常不时给接收端发送次包进行探测。发送端会根据接收端主机的指示对发送数据的量进行控制,这样就行程了完整的TCP流量控制。
    • 探测包是仅包含一个字节以获取最新窗口大小信息的数据段。
  • 6.4.9 拥塞控制
    • 为了在发送端调节所要发送数据的量,定义了一个叫做拥塞窗口的概念。于是在慢启动的时候将这个拥塞窗口的大小设置为1个数据段(1MISS)发送数据,之后每收到一个确认应答(ACK),拥塞窗口的值就加1.在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们中较小的那个值,发送比其还要小的数据量。随着包的每次往返,拥塞窗口也会以1,2,4指数函数增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超过这个阀值,在每次收到一次确认应答时,只允许以下这种比例放大拥塞窗口: (1个数据端的字节数/拥塞窗口-字节) * 1个数据段字节数。窗口越大,确认应答的数目也会增加,不过随着每收一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数,因此,拥塞窗口的大小会呈直线上升的趋势。TCP的通信开始时,并没有设置相应的慢启动阀值,而是在超时重发时才会设置为当时拥塞窗口一半的大小。最终的情况就是,当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥塞的发生吞吐量也会急速下降。于是再次进入吞吐量慢慢上升的过程,因此所谓TCP的吞吐量的特点就好像是在逐步占领网络带宽的感激。
  • 6.4.10 提高网络利用率的规范
    • Nagle算法,指发送端即使还有应发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说下,只有满足以下任意一个条件才能发送数据。
      • 已发送的数据都已经收到确认应答时
      • 可以发送最大段长度(MISS)的数据时
    • Nagle虽然网络利用率可以提高但是可能造成某种程度的延迟。
    • 捎带应答指在同一个TCP包中即发送数据又发送确认应答的一种机制。由此网络的利用率会提高,计算机的负荷也会减轻。不过确认应答必须得等到应用处理完数据并将作为回执的数据返回为止,才能进行捎带应答。⚠️没有启用延迟确认应答就无法实现捎带应答,延迟确认应答是能够提高网络利用率从而降低计算机处理负荷的一种较优的处理机制。
  • 6.4.11 使用TCP的应用