• 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所发的报文段
  • 相关阅读:
    在macOS上安装Homebrew教程
    青少年护眼台灯哪个牌子好?国家认可的护眼台灯品牌
    如何通过快解析测试接口内外网?本地内网ip让外网访问连接
    说说你对归并排序的理解?如何实现?应用场景?
    如何解决国标GB28181视频平台EasyGBS国标云服务平台设备在线,通道却显示离线的情况
    同样是测试员,为什么有的人薪资15K,有的人薪资20-30W,学会谈薪真的很重要
    Java基于微信小程序的校园生活互助小助手
    【Java】<泛型>,在编译阶段约束操作的数据结构,并进行检查。
    ChromeOptions 设置WebDriver/ChromeDriver的请求头参数
    2023第十二届中国智能产业高峰论坛之文档大模型的探索与思考
  • 原文地址:https://blog.csdn.net/liqifff/article/details/126884762