图解TCP/IP读书笔记

IP

IP即网际协议,作用是实现终端节点之间的通信,属于网络层。
数据链路层的作用是在互连同一种数据链路的节点之间进行包传递,要跨越多种数据链路,需要借助网络层。网络层可以跨越不同的数据链路实现两端节点的数据包传输。

IP大致有三大作用模块,IP寻址,路由,以及IP分包与组包。

Hop译为跳,是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间,IP包正是在网络中一个跳间被转发。

所有主机都维护者一张路由控制表,该表记录IP数据在下一步应该发给哪个路由器,IP包将根据这个路由表在各个数据链路上传输

IP是实现多个数据链路之间通信的协议,不同的数据链路的地址都可以被抽象为IP地址,数据链路的区别在于各自的最大传输单位(MTU)不同

IP进行分片处理,将较大的IP包分成多个较小的IP包,来解决不同链路MTU不同的问题。

IP属于面向无连接型,即在发包之前,不需要建立与对端目标地址之间的连接。面向连接的情况,则需要事先建立连接,如果对端主机关机或不存在,则不能建立连接。面向无连接则不同,即使对端主机关机或不存在,数据包还是会被发送出去。IP采用面向无连接主要为了简化和提速。

路径MTU发现,即寻找发送端主机到接收端主机路径中所有的数据链路的最小的MTU。

路径MTU发现的工作原理:发送端主机发送IP数据报时将首部的分片禁止标志位设置为1,这样途中的路由器及时遇到分片才能处理的大包,也不会分片,而是将包丢弃,然后通过一个ICMP的不可达消息将该MTU发给发送主机,下一次,发送主机将上面收到的MTU设为当前MTU,然后继续发送给目标主机,知道数据包被发送到目标主机为止,最后一次ICMP通知的MTU即为路径上最小的MTU。

IPv4首部:版本,首部长度,区分服务,总长度,标识, 标志,片偏移,生存时间,协议,首部校验和,源地址,目标地址,可选字段,填充

TCP

TCP用于在传输层有必要实现可靠传输的情况,UDP用于对高速传输和实时性有较高要求的通信或广播通信。

TCP和UDP中通常用源IP地址,目标IP地址,协议,源端口号,目标端口号这五个信息来识别一个通信。

TCP充分实现了数据传输时的各种控制功能,可以进行丢包时的重发控制,对次序乱掉的分包进行重组等,作为面向有连接的协议,只在确认通信对端存在时才会发送数据。

为了通过IP数据报实现可靠性传输,需要解决数据的破坏,丢包,重复,以及分片顺序混乱等问题,TCP通过校验和,序列号,确认应答,重发控制,连接管理以及窗口控制等机制实现可靠性传输。

序列号和确认应答

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫确认应答(ACK)。

发送端发出数据后等待对端的确认应答,如果有确认应答,表明数据已到达,一定时间内没有等到确认应答,则认为丢失,并进行重发,由此即使发生丢包,仍能保证数据到达对端,实现可靠传输。

未收到确认应答也不一定意味着数据丢失,也可能是已经收到,返回的确认应答在途中丢失或延迟到达,此时发送端会重发数据。接收端会反复收到相同的数据,必须放弃重复的数据包,因此需要一种机制,能识别是否已经接收数据,以及判断是否需要接收,TCP中通过序列号来实现。接收端通过接收数据TCP首部的序列号和数据的长度,将下一步应该接受的序号作为确认应答返送回去,通过序列号和确认应答号,TCP可以实现可靠传输。

重发超时的确定

在每次发包时会计算往返时间及其偏差,重发超时就是比往返时间和偏差的和稍大一点的数值,在Unix以及windows都是以0.5秒为单位,因此重发超时都是0.5秒的整数倍,数据被重发后还是收不到确认应答会再次重发,等待确认应答的时间会以2倍4倍的指数函数延长,数据也不会无限重发,到达一定次数后,会认为对端主机故障,强制关闭连接。

连接管理

TCP提供面向有连接的通信传输。面向有连接指在数据通信之前先做好通信两端的准备工作。

在数据通信之前,TCP发送一个SYN包请求建立连接,接收端返回一个包含针对SYN的确认应答以及请求建立连接的SYN包给发送端,发送端再发送一个确认应答,这样就建立了一个TCP连接,需要发送三个包,也被称为三次握手。

连接的建立和关闭:
建立连接

结束连接需要四个包,客户端发送请求切断连接(FIN),服务端发送一个确认应答作为返回,然后服务端发送一个请求切断连接(FIN),客户端返回一个确认应答,连接关闭。

TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,称其为最大消息长度(MSS: maximun segment size), TCP传送大量数据时,以MSS的大小将数据分割发送,重发也是以MSS为单位。MSS是在三次握手的时候,两端的主机发出建立连接的请求时会在TCP首部写入MSS选项,然后在两者之间较小的值投入使用

使用窗口控制提高速度

TCP以一个段为单位,每发一个段进行一次确认应答的处理,但这样可能会很慢。TCP引入窗口的概念,确认应答不再是以每个分段,而是更大的单位进行确认,也就是说,发送端主机在发送一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是无需等待确认应答而可以发送数据的最大值。这个机制使用了大量的缓冲区,发送端主机在等到确认应答返回之前,必须在缓冲区中保留相关数据,收到确认应答,则可以在缓冲区清楚。

窗口控制与重发控制

在没有使用窗口控制的时候,没有受到确认应答的数据都会被重发,而使用了窗口控制,某些确认应答即使丢失也无需重发。窗口在一定程度上较大时,即使有少部分的确认应答丢失也不会进行数据重发,可以通过下一个确认应答进行确认

当某个段丢失时,接收主机如果收到一个应该接收的序号以外的数据时,会针对当前为止收到的数据返回确认应答,并将接收的序号以外的数据暂时保存在缓冲区中。

如下图所示,1001到2000的段数据丢失,发送端会一直收到序号为1001的确认应答,,当连续收到3次同一个确认应答,将对所对应的数据进行重发,这种机制比超时管理更加高效,被称作高速重发控制。注意2001到7000的这几段的确认应答都是1001,但数据保存在缓冲区,因此在收到1001到2000的段时,根据已收到的数据返回确认应答7001,表示已接受1~7000字节的数据。

屏幕快照 2018-08-11 下午5.58.16.png

流控制

TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,就是所谓的流控制。具体来说,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端发送不超过这个限度的数据,这个大小限度就称作窗口大小。TCP首部中有一个字段来通知窗口大小,接收主机将自己可以接收的缓冲区的大小放入这个字段通知给发送端,值越大,说明网路吞吐量越高。窗口大小会在接收主机缓冲区面临数据溢出时被设置为更小的值通知发送端,以控制数据发送量。

屏幕快照 2018-08-11 下午6.10.01.png

拥塞控制

计算机网络处在一个共享的环境,有可能因为其他主机之间的通信使得网络拥堵,网络拥堵时,突然发送一个较大量的数据,可能会导致整个网络的瘫痪,TCP为了防止该问题出现,会通过一个叫做慢启动的算法得出的数值,对发送的数据量进行控制。

为了调节发送端需要发送数据的量,定义了一个叫做拥塞窗口的概念,在慢启动的时候,将拥塞窗口的大小设置为1个数据段,之后每收到一个确认应答,拥塞窗口的值就加1。发送数据包时,比较拥塞窗口的大小与接收端主机通知的窗口大小,发送一个比二者之间较小的值还要小的数据量。不过随着确认应答的增加,拥塞窗口会以指数级的速度增长,因此引入了慢启动阈值的概念,如果拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许以(1个数据段的字节数)*(1个数据段的字节数)/(拥塞窗口的字节数)的比例放大拥塞窗口。

屏幕快照 2018-08-12 下午4.50.39.png

拥塞窗口越大,确认应答的数目也会增加,不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过一个数据段的字节数,因此,拥塞窗口的大小会呈直线上升的趋势。

TCP的通信开始时,并没有设置相应的慢启动阈值,而是在超时重发时,才会设置为当时拥塞窗口一半的大小。

重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同,前者要求至少三次的确认应答数据段到达对方主机后才会出发,相比后者网络的拥堵要轻一些。

一般情况下,窗口越大,越会形成高吞吐的通信。当tcp通信开始后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降,于是会再次你如吞吐量慢慢上升的过程,因此tcp吞吐量的特点就好像是在逐步占领网络带宽的感觉。

提高网络利用率的规范

Nagle算法

TCP为了提高网络的利用率,经常使用一个叫做Nagle的算法,该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说,需要满足下列条件之一才能发送数据,否则会暂时等待一段时间再进行数据发送。

  • 已发送的数据都已经收到确认应答
  • 可以发送最大段长度(MSS)的数据

根据这个算法虽然网络利用率可以提高,但可能会发生延迟。

延迟确认应答

接收数据的主机如果每次都立刻回复确认应答的话,可能会返回一个较小的窗口,那是因为刚接收完数据,缓冲区已满。
当某个接收端收到这个小窗口的通知以后,会以此为上限发送数据,从而又降低了网络的利用率。为此,引入了一个方法,就是收到数据以后并不立即返回确认应答,而是延迟一段时间的机制。

  • 在没有收到2*最大段长度的数据为止不做确认应答
  • 其他情况下,最大延迟0.5秒发送确认应答(很多操作系统设置为0.2秒左右)

事实上,大可不必为每一个数据段都进行一次确认应答。TCP采用滑动窗口的控制机制,因此通常确认应答少一些也无妨。tcp文件传输中,绝大多数是每两个数据段返回一次确认应答。

捎带应答

根据应用层协议,发送的消息到达对端,对端处理之后会返回一个回执。TCP的确认应答和回执数据可以通过一个包发送,这种方式叫捎带应答。
如果接收数据以后立即返回确认应答,则无法实现捎带应答,也就是说如果没有启用延迟确认应答就无法实现捎带应答。延迟确认应答是能够提高网络利用率而降低计算机处理负荷的一种较优的处理机制。

UDP

面向无连接,通常用于一下几个方面

  1. 包总量较少的通信(DNS, SNMP等)
  2. 视频音频等多媒体通信(即时通信)
  3. 限定于LAN等特定网络中的应用通信
  4. 广播通信(广播,多播)