04 TCP协议通讯流程、如何理解套接字文件描述符

本文详细阐述了TCP协议的通信流程,包括服务器初始化、三次握手建立连接、全双工数据传输以及四次挥手断开连接。同时对比了TCP与UDP的区别,并解释了套接字文件描述符的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


TCP协议通信流程

一个服务器有可能有多个客户端来进行链接,链接一旦多了起来,同样需要对其进行管理。管理是需要成本的,体现在时间和空间上,即服务器和客户端为了维护这个链接、在系统层面都要提供一批数据结构来管理这批链接(udp不需要做、因此速度相对更快)。

CS模型:客户端主动发起链接、服务器被动,不会主动发起链接就叫做CS模型。
BS模型:通过游览器去访问服务器、本质上也是CS模型。

服务器初始化:

  1. 调用socket, 创建文件描述符。
  2. 调用bind, 将当前的文件描述符和ip/port绑定在一起; 如果这个端口已经被其他进程占用了, 就会bind失败。
  3. 调用listen, 声明当前这个文件描述符作为一个服务器的文件描述符, 为后面的accept做好准备。
  4. 调用accecpt, 并阻塞, 等待客户端连接过来符。

建立连接的过程:

  1. 调用socket, 创建文件描述符。
  2. 调用connect, 向服务器发起连接请求。
  3. connect会发出SYN段并阻塞等待服务器应答; (第一次)。
  4. 服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建立连接"; (第二次)。
  5. 客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)。

这个建立连接的过程, 通常称为 三次握手

在这里插入图片描述

数据传输的过程:

  1. 建立连接后,TCP协议提供全双工的通信服务; 所谓全双工的意思是, 在同一条连接中, 同一时刻, 通信双方可以同时写数据; 相对的概念叫做半双工, 同一条连接在同一时刻, 只能由一方来写数据。
  2. 服务器从accept()返回后立刻调用read(), 读socket就像读管道一样, 如果没有数据到达就阻塞等待。
  3. 这时客户端调用write()发送请求给服务器, 服务器收到后从read()返回,对客户端的请求进行处理, 在此期间客户端调用read()阻塞等待服务器的应答。
  4. 服务器调用write()将处理结果发回给客户端, 再次调用read()阻塞等待下一条请求。
  5. 客户端收到后从read()返回, 发送下一条请求,如此循环下去。

断开连接的过程:

  1. 如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次)。
  2. 此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次)。
  3. read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端发送一个FIN; (第三次)。
  4. 客户端收到FIN, 再返回一个ACK给服务器; (第四次)。

这个断开连接的过程, 通常称为 四次挥手。
在这里插入图片描述


TCP和UDP的对比

  • TCP:
    可靠传输、有连接、面向字节流
    • TCP提供可靠的传输(有序,无差错,不丢失,不重复)
    • TCP提供拥塞控制和流量控制机制
    • TCP提供面向连接的传输,通信前要先建立连接(三次握手机制)
    • TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组
    • 每条TCP连接只能有两个端点(一对一)
  • UDP:
    不可靠传输、无连接、面向数据报
    • 不可靠传输:将数据报文传递给下一层即可、其中发生了什么数据是否安全到达等等。UDP协议不再关心因此容易导致丢包。
    • UDP不提供拥塞控制和流量控制机制
    • UDP是面向数据报的传输,没有分组开销。数据报:读取数据是由明显边界的,要么读,要么不读,就好比去拿快递,要么拿一个,要么不拿,没有拿半个快递的说法。
    • UDP支持一对一,一对多,多对一和多对多的交互通信。
    • UDP存在的价值:1.简单2.不用创建连接3.越简单的东西,相对就较快
      比如:允许丢包的场景:直播(卡了不会重播、效率高、简单、快速)

如何理解套接字文件描述符

套接字是一个抽象出来的概念,本质上也是一个文件描述符。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也要写bug、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值