TCP/UDP是传输层协议,主要是目标主机到目标主机的通信;

TCP

TCP是面向连接的、可靠的、基于字节流的传输

  • 面向连接:两台计算机通讯需要建立一个通讯连接,建立过程就是“

    三次握手

    ”:客户端发起连接请求,服务端确认连接,客户端确认服务端的应答,建立连接成功。结束关闭连接时利用“

    四次挥手

    ”确保连接的中断。

    • 需要三次握手的原因:假设只有两次即可建立,当客户端发送第一次连接请求网络延迟,客户端认为第一次请求超时重发一次请求,第二次请求正常到达服务端,服务端确认后发送确认,客户端收到确认连接建立,开始发送数据;然而这时第一次请求连接到达了服务端,但是服务端无法知道这是客户端在第二次请求建立连接是之前发送的,然后服务端再次为这个请求发送确认同时开启连接,客户端收到确认建立连接后发送数据却用的是第二次连接,所以延迟建立的连接是无用的,这也就消耗浪费了网络资源;
    • 四次挥手:由于TCP是全双工的,所以连接A-》B和B-》A都要断。
      • 客户端A端发起关闭连接请求【1】
      • 服务端B端接收确认关闭A-》B的信息流向通道(B不再接受本连接的A的信息)发送确认关闭信息,同时B端也发起关闭连接给A端【2】
      • A端接收确认关闭B-》A信息流向通道(A不再接受本连接的B的信息)发送确认关闭信息。【1】
      • 这里注意最后一次挥手,A向B发确认,这时候A不能马上断开连接,还需要等待2MSL,MSL是报文段的最大生成时间,因为B还没收到A发的确认是还可以发送信息给A的,可能在此期间B又发送了数据,所以为了安全起见,A收到了结束请求发送确认还需要等2MSL才能关闭连接
  • 因为三次握手的建立连接过程确保了发送双方的发送和接收能力,同时TCP使用了流量控制和拥塞控制方法控制网络影响,所以TCP提供了可靠的传输

    • 流量控制:用的是滑动窗口,流量控制指的的两台计算机的流量控制。主要思路是连接上的两台计算机都维护了一个缓冲区,表示可接收数据量,缓存区就叫窗口,接收方需要把窗口大小发送给发送方,让其发送数据要小于这个值,这样接收方就不会因为处理速度问题接收不及所有的数据;滑动窗口指的就是发送方发送数据都是这个窗口大小的数据,可以看作窗口在发送数据不断移动,发送窗口内的数据。

    • 拥塞控制:是指整个网络的流量控制,具有全局性的。主要思想是慢慢试探,遇到阈值减低速度(一半)然后再试探(死亡边缘疯狂试探……直到非死亡最大值);发送窗口需要综合考虑网络允许发送的数据量和目的主机可接收数据量确定大小;实际的算法有四种:慢开始(slow-start)拥塞避免(congestion advoidance)快重传(fast retransmit)快恢复(fast recovery)

      • 拥塞窗口cwnd:是一个状态变量,由网络的拥塞程度决定了拥塞窗口的大小,发送窗口应该小于或等于拥塞窗口

      • 慢开始:主机开始发送数据时,不知道网络的负荷情况,不能发送大量的数据进入网络,发送窗口都是从小逐渐增大的:cwnd=1,发送方发送1个报文段,接收返回方返回1个确认,发送方cwnd+1,发送方再发2个报文段,接收方返回2个确认,发送方每收到一个确认cwnd就增加1;这样每经过一个传输轮次,cwnd就会翻倍。

        1=》2=》4=》8,这就是慢开始

      • ssthresh:显然不能然cwnd无限增大,这时后需要设置一个慢开始门限,ssthresh状态变量,开始时设ssthresh = 16

        • cwnd < ssthresh时,使用慢开始算法
        • cwnd > ssthresh时,使用拥塞避免算法
        • cwnd = ssthresh时,既可以是慢开始算法也可以是拥塞避免算法
      • 拥塞避免算法:思想是让cwnd缓慢的增大,即每经过一个往返时间RTT,cwnd增加1;在拥塞避免阶段遇到了超时时,判断发送了网络拥塞,此时设置ssthresh=cwnd/2,cwnd=1(初始化cwnd,减小ssthresh),然后再执行慢开始

      • 快重传算法:接收方按序发送接收报文段,当发现某一个报文段缺失时(M1接收了,然后没有M2但有M3传到)立即发送确认(发送前一个的确认,M1),后面再来两个也都发送这个确认(M4、M5也到了,但是都是发送M2确认),此时接收方就会收到四个连续重复的确认(M1、M3、M4、M5发的M1确认),说明有报文缺失(M2),发送方就立即重传这个报文(M2)

      • 快恢复算法:像上面,发生了连续重复的三个确认,说明只是个别的报文段发生丢失(并非是网络拥塞造成的超时),不启动慢开始算法,而是快恢复算法:ssthresh = cwnd/2 (没有cwnd=1)并开始拥塞避免算法

    • 基于字节流的传输:TCP中的数据就是一个流,没有明确的边界,也即,发送十次给客户端,因为没边界服务器不知道有几次数据在这里,所以可以一次就把这些数据读取了,也可分100次读取;而UDP的报文是直接加个首部直接发的,有边界,发送一次数据服务器就读一次数据

UDP

UDP是无连接传输,所以UDP不提供可靠传输也不需要建立连接,同时UDP是面向报文的,即对应用层的报文它只是加个UDP首部就交给IP层了,相对来说,TCP的消耗是更大的。总的来说它简单快捷,但是不可靠,功能单一。额外:UDP支持单播、多播、广播

  • 主要可以用到电话会议这种实时性比较高的场景

参考

面试官,不要问我三次握手和四次挥手

计算机网络(第七版)——谢希仁

最后更新: 2021年07月15日 23:57

原始链接: https://idkhts.github.io/2021/01/19/TCP%E5%92%8CUDP/