TCP与UDP

TCP

TCP 的连接与断开

TCP与UDP部分感觉与网络考研书上讲的比较接近,重点内容包括TCP的三次握手、四次挥手、TCP可靠传输、流量控制、拥塞控制

TCP三次握手

第一步:客户机的TCP首先向服务器的TCP发送一个请求连接报文段。这个特殊的报文段不包含应用层数据,其中首部的SYN标志位被置位1.另外客户机会随机选择一个起始序号seq=x

第二步:服务器的TCP收到请求的报文后,如同意建立连接,就向客户机发回确认,并为该TCP分配TCP缓存和变量。在确认报文段中,SYN和ACK被置为1,确认号的字段值为x+1

第三步:客户机收到确认报文段后向服务器给出确认,并且给该连接分配内存和变量,ACK置1,确认号为y+1

为什么TCP进行三次握手?

本质上TCP协议的三次握手需要解决这样一个问题:在不可靠的信道上(IP数据报尽最大努力交付)完成可靠的数据传输。而全双工的连接建立需要双方的连接请求和确认,这样最少需要使用三次握手才能建立连接

至于为什么三次是最少,客户端服务器二者最少都需要向对方发送一个同步报文(SYN),但是如果只有这两次握手,服务器就只能接受连接,无法确认连接;设想如果服务器接受一个SYN报文就建立连接,那客户端因为阻塞原因重发了N个SYN同步报文 ,服务器每接受到一个就需要建立一次连接,这是不堪设想的。所以只有当服务器接收到客户端第二次的ack确认报文后才会建立连接

TCP四次挥手断开连接

1538553330239

  • 客户端请求断开FIN1(客户端无更多数据)
  • 服务器ACK确认(收到,但是仍有数据传输)
  • 服务器请求断开FIN2(服务器无更多数据)
  • 客户端ACK确认

四次挥手中的状态

  • FINWAIT1 : 当客户端在established状态想要断开连接,主动向服务器器发送FIN报文,此时该socket便进入FINWAIT1状态
  • FINWAIT2: 这时客户端已经收到对方的确认ack,但是服务器可能还有数据未发送完成,还需要接受对方的数据,处于半连接(半关闭)状态
  • TIME_WAIT: 客户端接受到了对方的确认报文、也接收到了对方的fin报文,现在发出了最后的确认报文,进入一个2MSL的等待状态,如果等待状态没有重发便进入结束状态
  • CLOSE_WAIT : 服务器确认了客户端的终止请求,还有数据待发送
  • LAST_CHECK: 服务器方发送FIN后,最后等待对方的ACK报文
  • CLOSED : 连接中断

为什么需要四次握手

TCP是全双工的协议,通信中双方都需要知道对方的存在,而在结束时,双方也同时需要发送断开与确认对方的断开信息。当主机1发送FIN希望断开连接时,主机1已经没有要发送的数据了,但是其还是有可能接受主机2发送的数据,此时单方面的连接断开了,这时处于半连接状态。而只有主机2也向主机1发送断开请求并确认,双方才完全的断开。

TCP的半打开状态

如果TCP连接中一方已经关闭或异常终止另一方还不知道,这样的连接称为半打开状态。任何一端的主机都可能检测到这一情况,如果双方没有在半打开的连接上传输数据,双方就无法获悉异常。

半打开的一个常见原因是一方程序的非正常结束(断电、断网)如果A已经没有向B发送的数据,则B永远无法获悉A是否已经消失了。而当一方获取到异常的数据连接后(比如重启)直接进行复位(RST)处理

同时打开与同时关闭

两个程序的同时打开与同时关闭是有可能的,例如A:port1 向B:port2 发送SYN同步信息的同时,B:port2 也向A:port1发送了一个SYN同步信息,此时双发收到对方的SYN后各自向对方回一个ack表示,确认,连接就正常建立了,这样一个打开需要四个报文段。

而同时关闭同理,也是双方同时发送FIN报文段,双方在ack确认,这样还是使用4个报文段双方完成了连接的关闭只不过此时双方都跳过了FINWAIT2阶段

TCP可靠传输

TCP的任务是在IP层不可靠的、尽力而为的服务基础上建立的一种可靠的传输服务。TCP使用了校验、序号、确认和重传来达到这个目的,这里主要说一下重传,重传分两种

超时重传

TCP 每发送一个报文段,就对这个报文段进行一次计时,只要计时器到期而没有收到确认的的报文,就会重传这一报文。一个报文发出到确认的时间成为RTT(Round-Trip Time),TCP使用一了一种动态适应算法来调整RTT,而时间阈值与该RTT相关

冗余ACK(快速重传)

超时重传存在一个问题就是超时周期往往太长。幸运的是存在另一种方法,在超时前通过冗余ACK来较好的检测丢包情况。

TCP规定每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一接期待的序号.例如发送方发送了1、2、3、4、5的TCP报文段,其中2号报文段在传输中丢失,这样3、4、5号报文段对于B来说称为了失序报文段。在本例中,3、4、5都会发送一个针对1号报文段的冗余ACK表示自己想要接收2号报文段。TCP规定发送方收到同一个报文段的3个冗余ACK时,就可以认为跟在这个报文段之后的报文已经丢失,这种技术被称为快速重传

TCP流量控制

TCP流量控制服务消除接受方缓存区溢出的可能,可以说是一个速度匹配服务。

流量控制基于滑动窗口。发送方维护一个接受窗口,在TCP首部的窗口字段中声明,表示接收方可以接受的窗口大小,防止接受方报文队列溢出。

TCP流量控制与链路层流量控制的区别是,TCP是端到端的流量控制,由发送方与接收方商议。而链路层的流量控制是相邻中间节点的流量控制。而且TCP滑动窗口可变,后者不可变

TCP拥塞控制

慢开始和拥塞避免

  • 慢开始算法

    TCP连接建立时,先令cwnd窗口=1,即一个最大的报文段长度。每次收到一个确认报文段,将cwnd+1。使用慢开始算法,会使得每一个传输轮次后cwnd加倍,这样它会一种指数增长到一个限定值

  • 拥塞避免算法

    拥塞避免算法的做法是每经过一个往返时延RTT就增加一个MSS的大小,这样cwnd按线性规律增长

  • 网络拥塞的处理

    1. 使用慢开始算法,cwnd从1开始指数增大
    2. cwnd达到ssthresh时,启用拥塞避免算法,cwnd线性增大
    3. 当网络发生拥塞时,将cwnd置1从头慢开始算法;将ssthresh设置为拥塞值的一半

快重传和快恢复

  • 快重传

    当发送方收到3个冗余ACK的报文时,直接重传对方尚未收到的报文段而不必等待

  • 快恢复

    当发送端连续接收到3个冗余ACK后,执行乘法减小算法。将慢开始的额门限ssthresh设置成拥塞cwnd的一半,将cwnd值设置为拥塞cwnd的一半,并执行拥塞避免算法

UDP

UDP简介

UDP只做传输协议能做的最少工作,只在IP数据服务上增加了两个最基本的服务:复用和分用 以及差错检测

UDP首部只有8个字节,分为四个字段:源端口、目的端口、UDP长度、UDP校验和

  • UDP无需建立连接
  • UDP不维护连接状态
  • UDP分组首部开销小
  • UDP没有拥塞控制,适合容许一些数据丢失但是不允许有较大时延的应用

TCP和UDP的区别

TCP和UDP协议特性的区别,主要从连接性、可靠性、有序性、拥塞控制、传输速度、头部大小来讲

  1. TCP面向连接,UDP无连接。TCP3次握手建立连接,UDP发送前不需要建立连接
  2. TCP可靠,UDP不可靠,TCP丢包有确认重传机制,UDP不会
  3. TCP有序,会对报文进行重排;而UDP无序,后发送信息可能先到达
  4. TCP必须进行数据验校,UDP的校验可选
  5. TCP有流量控制(滑动窗口)和拥塞控制,UDP没有
  6. TCP传输慢,UDP传输快,因为TCP要建立连接、保证可靠有序,还有流量、拥塞控制
  7. TCP包头较大(20字节)UDP较小(8字节)
  8. 基于TCP协议:HTTP/HTTPS、Telnet、FTP、SMTP 基于UDP的协议 DHCP、DNS、SNMP、TFTP、BOOTP