【C++】网络套接字编程(二)

在上一次的博客【C++】网络套接字编程(一)中,我们介绍了基础的网络套接字编程,并实现了udp和tcp. 虽然我们已经知道每个接口的使用方法,但是对于这些接口的作用和使用时机并不了解。

今天我们会带大家了解tcp的通信流程,更近一步的理解代码。因为只是了解,所以没有过于深入的讲解。


TCP协议通信流程

1. 服务器初始化

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

2. 建立连接

2.1连接

客户端连接服务器的时候,本质就是连接服务器的操作系统(协议栈)模块。

对于服务器的OS,肯定有大量的客户端来连接,此时,OS内会存在大量的客户端连接,于是,服务器必须将这些连接管理起来,也就是常说的“先描述,再管理”。

也就是说,建立连接的本质是在双方的OS内,维护对应的连接数据结构。建立连接是有成本的,无论是空间还是时间。


2.2 简单理解三次握手

对于三次握手,我们可以简单理解为下图:
在这里插入图片描述
三次握手,就是一个建立连接的过程,在握手成功之后,就会在连接双方OS内建立连接相关的数据结构。


2.3 全双工 与 半双工

对于全双工 与 半双工 有一个很好的例子,我们平常所谓的沟通,就是半双工,多人之间同一时间内只有一个人在说话,而所谓的吵架,就是全双工,所有同时说话。

tcp 是全双工的,对于一个套接字,我们可以同时读写.


2.4 简单理解四次挥手

四次挥手,就是一个断开连接的过程,本质上就是释放双方OS内对应的相关数据结构。

其中,因为断开链接需要得到双方的同意,所以才会要有四次挥手。

在这里插入图片描述

3. TCP 流程图

有了上面的基本概念,我们可以大致总结一下 tcp通信的流程:
在这里插入图片描述

  1. 在用户层,首先将服务器初始化,客户端初始化。
  2. 由客户端 connect 在传输层发起三次握手,由于服务器存在绑定好的sock,且处于监听状态(可连接状态),所以握手之后,连接成功。
  3. accept将传输层建立好的连接拿到应用层
  4. 通信
  5. server 与 client 分别调用 close(fd), 在传输层分别挥手两次,共四次挥手,断开连接.

猜你喜欢

转载自blog.csdn.net/qq_53268869/article/details/125081912