在上一次的博客【C++】网络套接字编程(一)中,我们介绍了基础的网络套接字编程,并实现了udp和tcp. 虽然我们已经知道每个接口的使用方法,但是对于这些接口的作用和使用时机并不了解。
今天我们会带大家了解tcp的通信流程,更近一步的理解代码。因为只是了解,所以没有过于深入的讲解。
TCP协议通信流程
1. 服务器初始化
- 调用socket,创建文件描述符
- 调用bind,将当前的文件描述符 和 ip/port绑定在一起(如果端口已被其他进程占用,就会bind消失)
- 调用listen,声明当前这个文件描述符作为一个一个服务器的文件描述符,为之后的accept做好准备
- 调用accept,并阻塞,等待客户端连接过来。
2. 建立连接
2.1连接
客户端连接服务器的时候,本质就是连接服务器的操作系统(协议栈)模块。
对于服务器的OS,肯定有大量的客户端来连接,此时,OS内会存在大量的客户端连接,于是,服务器必须将这些连接管理起来,也就是常说的“先描述,再管理”。
也就是说,建立连接的本质是在双方的OS内,维护对应的连接数据结构。建立连接是有成本的,无论是空间还是时间。
2.2 简单理解三次握手
对于三次握手,我们可以简单理解为下图:
三次握手,就是一个建立连接的过程,在握手成功之后,就会在连接双方OS内建立连接相关的数据结构。
2.3 全双工 与 半双工
对于全双工 与 半双工 有一个很好的例子,我们平常所谓的沟通,就是半双工,多人之间同一时间内只有一个人在说话,而所谓的吵架,就是全双工,所有同时说话。
tcp 是全双工的,对于一个套接字,我们可以同时读写.
2.4 简单理解四次挥手
四次挥手,就是一个断开连接的过程,本质上就是释放双方OS内对应的相关数据结构。
其中,因为断开链接需要得到双方的同意,所以才会要有四次挥手。
3. TCP 流程图
有了上面的基本概念,我们可以大致总结一下 tcp通信的流程:
- 在用户层,首先将服务器初始化,客户端初始化。
- 由客户端 connect 在传输层发起三次握手,由于服务器存在绑定好的sock,且处于监听状态(可连接状态),所以握手之后,连接成功。
- accept将传输层建立好的连接拿到应用层
- 通信
- server 与 client 分别调用 close(fd), 在传输层分别挥手两次,共四次挥手,断开连接.