TCP三次握手四次挥手

基于TCP协议的客户端/服务器程序的一般流程

TCP建立与断开——三次握手四次挥手

在这里插入图片描述

服务器初始化

  • 调用socket,创建文件描述符;
  • 调用bind 将当前文件描述符的ip/port绑定在一起;如果这个端口已经被其他进程占用,则会绑定失败;
  • 调用listen,声明当前文件描述符为一服务器的文件描述符,为后面的accept做好准备。

建立链接的的过程(三次握手)

  • 调用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是全双工协议,建立连接的核心要务是验证双方通信信道是联通的!!!
  • 三次握手是验证双方通信信道的最小次数(前两次是验证client是可以接受和发送的,后两次验证的而是server可以接受和发送的)
  • 链接建立异常的情况下,一定已经建立的链接是client端的(谁最后发送ACK,谁就先维护链接)
  • 如果是偶数次建立链接,那么连接异常一定是在server上。

为什么是四次挥手

因为TCP是全双工,所以最少需要四次挥手,双方进行通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值