当前位置: 首页 > news >正文

_linux (TCP协议通讯流程)

文章目录

  • TCP协议通讯流程
  • TCP 和 UDP 对比

TCP协议通讯流程

  • 下图是基于TCP协议的客户端/服务器程序的一般流程:
    在这里插入图片描述

服务器初始化:

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

建立连接的过程:

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

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

数据传输的过程:

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

断开连接的过程:

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

这个断开连接的过程, 通常称为 四次挥手。

在这里插入图片描述

TCP 和 UDP 对比

  • 可靠传输 vs 不可靠传输
  • 有连接 vs 无连接
  • 字节流 vs 数据报
http://www.lryc.cn/news/18174.html

相关文章:

  • PMP考试详解,新考纲有什么变化?
  • C++学习笔记-日期和时间
  • Nordic nRF芯片FDS模块学习
  • JVM 学习(1)—JVM 与 JMM 内存模型简单理解
  • NMS详解
  • 考出PMP证书到底有没有用?
  • 寻路库recastnavigation改造
  • pandas 一些设置随记
  • SSIM学习
  • selenium自动化测试用例需要关注的几点
  • harfbuzz 的用法
  • JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc
  • Python学习笔记——PIL库(Pillow库)总结
  • C. Build Permutation【整数理论、构造、思维】
  • 关于ETL的两种架构(ETL架构和ELT架构)
  • android系统目录
  • 【C/C++】中【typedef】用法大全
  • 超实用的公众号运营攻略分享,纯干货
  • 编写NodeJs脚本实现接口请求
  • 【无人机】回波状态网络(ESN)在固定翼无人机非线性控制中的应用(Matlab代码实现)
  • YAML 文件简介
  • Python四大主题之一【 Web】 编程框架
  • 【C++】哈希表
  • 深度学习入门(六十七)循环神经网络——注意力机制
  • 阿里云云通信风控系统的架构与实践
  • 【性能测试】loadrunner(一)知识准备
  • 【Vue3源码】第五章 ref的原理 实现ref
  • [Flink]部署模式(看pdf上的放上面)
  • Linux 查看 CPU 信息,机器型号,内存等信息
  • 三维量子力学 量子力学(3)