TCP协议通信中的三次握手,四次挥手

TCP协议通信建立连接:

(1)服务器初始化

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

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

—数据传输过程:

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

TCP协议通信断开连接:

—四次挥手:

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