• Linux网络编程基础


    TCP/IP

    简述一下TCP建立连接和断开连接的过程。

    在这里插入图片描述

    三次握手:

    • 内核体现

    在这里插入图片描述

    • 用户空间就是函数的执行

    三次握手

    1. Client(客户端)将标志位SYN置为1,随机产生一个数据包seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    2. Server收到数据包后由标志位ACK=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个数据包seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
    3. Client收到确认后,检查ack是否为J1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    数据传输:
    在这里插入图片描述

    • 建立连接以后就是互相传输数据,ACK=上个数据包+1,再随机产生数据包互相传输

    四次挥手:

    内核空间:
    在这里插入图片描述

    TCP保证可靠性?

    1. 序列号、确认应答、超时重传
      数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。
    2. 窗口控制与高速重发控制/快速重传(重复确认应答)
      使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒…

    TCP的三次握手和四次挥手的原因是什么?

    为什么是三次握手?

    1. 为了防止已失效的连接请求报文段突然有送到了B,因而产生错误
    2. 假设两次握手时,A发出的第一个请求连接报文段在某一网络节点长时间滞留,以致延误到连接释放后才到达B。B收到失效的连接请求报文段后,认为是A又发出一次新的连接请求。于是向A发送确认报文段,同意建立连接,此时在假定两次握手的前提下,连接建立成功。这样会导致B的资源白白浪费
    3. 假设两次握手时,A发出一个请求报文段,但发送过后A就因为问题而导致下线。之后B收到了A发来的请求连接报文段,给A发送确认报文段,同意建立连接,此时在假定两次握手的前提下,连接建立成功。这样会导致B的资源白白浪费

    为什么是四次挥手?

    1. TCP协议是全双工通信,这意味着客户端和服务器端都可以向彼此发送数据,所以关闭连接是双方都需要确认的共同行为
    2. 假设是三次挥手时,首先释放了A到B方向的连接,此时TCP连接处于半关闭(Half-Close)状态,这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段
  • 相关阅读:
    算法竞赛入门【码蹄集进阶塔335题】(MT2330-2335)
    法语翻译器在线翻译器
    用什么工具来画UML?
    嵌入式模拟时间片轮询调度算法
    软件工程专业如何论文选题?
    VIM去掉utf-8 bom头
    [补题记录] Atcoder Beginner Contest 295(E)
    Android中framework
    [USACO2012-Mar-Silver] Flowerpot 题解(单调队列 c++)
    QT操作SQLite数据库_界面方式_增删改查
  • 原文地址:https://blog.csdn.net/liqifff/article/details/126884762