TCP常考

作者: 小麻巧吃西瓜 | 来源:发表于2020-04-17 23:14 被阅读0次

    1. TCP和UDP的区别

    用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
    传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

    UDP构造可靠传输:加上必要的包头字段:数据完整性 –> 加上一个16或者32位的CRC验证字段; 乱序 –> 加上一个数据包序列号SEQ; 丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制;协议字段 –> protol 字段,标识当前使用协议。

    2. TCP头部

    序号:用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
    确认号 :期望收到的下一个报文段的序号。
    数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
    确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
    同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
    终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
    窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。


    3. 三次握手

    1. 服务器端处于LISTEN,客户端处于CLOSED。
    2. 客户端向服务器端发送请求连接报文段,SYN=1,ACK=0,并选择一个初始序号x。
    3. 服务器端若同意建立连接,向客户端发送确认报文段,SYN=1,ACK=1,确认号x+1,并选择一个初始序号y。
    4. 客户端收到确认报文段后,发送确认,确认号问y+1,序号为x+1。

    第三次握手的原因?
    客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。而失效的连接请求到达服务器,会让服务器错误打开连接。

    4.四次挥手

    1. 服务器端,客户端处于ESTABLISHED。
    2. 客户端发送一个连接释放报文段,FIN=1。
    3. 服务器端发送确认,TCP处于半关闭状态。客户端仍可以接收数据。
    4. 当服务器端不再需要连接的时候,发送连接释放报文段,FIN=1。
    5. 客户端收到去人,进入TIME_WAIT(2MSL(最大报文存活时间)),然后释放连接。
    6. 服务器端收到确认后释放连接。

    TIME_WAIT原因?
    确保最后一个确认报文能够到达。如果 服务器端没收到客户端发送来的确认报文,那么服务器端就会重新发送连接释放请求报文。
    让本连接持续时间内所产生的所有报文都从网络中消失,避免在新的连接中出现旧的报文。

    5.实现可靠传输?

    5.1超时重传

    如果一个已经发送的报文段在超时时间(略大于RTT(报文段从发送再到接收到确认所经过的时间))内没有收到确认,那么就重传这个报文段。

    5.2滑动窗口

    发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
    发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认(接收窗口只会对窗口内最后一个按序到达的字节进行确认),那么就滑动窗口至第一个字节不是已发送且已确认的状态。
    接受方可以通过控制窗口大小来进行流量控制

    5.2拥塞控制

    cwnd为拥塞窗口,是一个状态变量。
    慢开始和拥塞避免
    慢开始:cwnd=1,收到确认后,cwnd加倍。并设置一个慢开始门限 ssthresh,当cwnd >= ssthresh 时,进入拥塞避免。
    拥塞避免:cwnd 每轮加 1。
    若出现了超时,令ssthresh = cwnd / 2,重新执行慢开始。
    快重传与快恢复
    在发送方,如果收到三个重复确认,那么可以知道下一个数据块丢失,此时执行快重传,立即重传下一个报文段。执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,此时直接进入拥塞避免。

    相关文章

      网友评论

          本文标题:TCP常考

          本文链接:https://www.haomeiwen.com/subject/qdqpvhtx.html