zoukankan      html  css  js  c++  java
  • 运输层(TCP/UDP)详解

    TCP和UDP的区别:

    tcp是面向连接的可靠的传输协议

    udp是非连接的不可靠的传输协议

     TCP组成

    可以看到虽然tcp是面向字节流的,但是其传输的基本单位还是报文(tcp首部和数据,ip报文和udp报文也是由首部和数据组成)

    TCP的主要特点:

    1.面向连接,应用程序在使用tcp之前,必须建立tcp连接,在传输完成之后再释放连接

    2.点对点连接(UDP可以一对多,一对一)

    3.tcp连接传输的数据是可靠的交付服务

    4.全双工,双方可以再任意时刻发送数据

    5.面向字节流,虽然应用程序和TCP交互的是大小不等的数据块,但是tcp只保证,发送方和接收方接到的字节流相同。

    TCP连接:

    每条tcp连接有两个端点,连接的两个端点称为套接字(socket)

    套接字是由ip和端口号组成的。例如 127.0.0.1:8080

    TCP可靠传输的工作原理

    tcp通过校验和,重传控制,序号标识,滑动窗口,确认应答实现可靠传输。如丢包时的重发机制,还可以对次序乱掉的分包进行顺序控制。

    1.停止等待协议

    每发完一个分组,就等对方确认,在收到对方确认后再发送下一个分组

    2.滑动窗口

    3.超时重传

    4.基于滑动窗口的流量控制

    5.拥塞控制(tcp拥塞控制的方法  慢开始,拥塞避免,快重传,快恢复)

    TCP的连接管理(三次握手)

    服务器是处于监听状态的,以便及时发现客户端建立连接的需求。
    客户端TCP进程主动发出Flag段SYN=1,报文序列号seq=x的报文段(A),请求建立连接。状态变为SYN-SENT(同步已发送)。
    服务器收到对应报文段(A)后,会发出确认报文段(B)。
    该报文(B)的Flag段的SYN和ACK都是1,确认号ack
    =x+1(意为对A的确认),同时设定自己的初始序列号seq=y。状态由LISTEN(监听)变为SYN-RCVD(同步收到)。 客户端收到服务器的确认后,还需向服务器发送确认。报文段(C)的Flag的ACK=1,确认号ack=y+1(意为对B的确认),序列号seq=x+1。状态变为ESTABLISHED(已建立连接)。
    服务器在收到报文段后状态也变为ESTABLISHED。 客户端的最后确认是必要的,可以防止以失效的请求建立连接报文突然到达服务器而产生错误。

    为什么要三次握手呢?

    若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。
    此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。
    此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。
    但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源

    参考:

    https://juejin.im/post/5a49d95af265da430a50ed8c
  • 相关阅读:
    手游营销的10个靠谱方向
    创业三个月总结---记录这三个月的酸甜苦辣咸!!!
    创业三个月总结---记录这三个月的酸甜苦辣咸!!!
    Notepad++ 删除空白行的方法
    Notepad++ 删除空白行的方法
    几种常见容器比较和分析 hashmap, map, vector, list ...hash table
    hdu 3371
    hdu 1879
    hdu 1875
    hdu 1863
  • 原文地址:https://www.cnblogs.com/LcMiho/p/10195222.html
Copyright © 2011-2022 走看看