三次握手:

三次握手在调用connect链接前保证双方准备资源,请求包一般是syn类型,回复的包一般是ack类型用来区分
  1. 第一次客户端给服务器发送,还包含一个随机值,
  2. 第二次服务器接收到了随机值确定是客户端并进行处理,任何生成一个先的随机值发送给客户端(将对客户端处理过的包和自己的随机值合并发送给客户端为了节省时间)
  3. 第三次客户端接收到服务器发来的随机字进行处理发送过去,完成三次握手,可以进行数据传输

python脚本实现三次握手 python tcp三次握手_http

四次挥手:

四尺挥手为了释放资源

  1. 第一次,如果客户端先调用close,然后操作系统会发一个包给服务器,
  2. 第二次因为遵循tcp协议,服务器接收到必须给予回复,表示已经接收到了
  3. 第三次因为收到了客户端发来的包,所以recv()会解堵塞,然后就进行判断,因为包没有数据所以会调用close()关闭,又因为服务器调用close了,操作系统就会给客户端发送一个包
  4. 第四次因为遵循tcp协议,所以客户端会服务器回复表示以及收到了
    但是此时客户端不会立刻释放资源会等待,因为它发送过去的包还不能确认对方是否收到,但是服务器发过来的包你没有给予回复,它会有一个超时时间,超过这个时间它认为你没有收到,继续给你传,

所以总结谁先调用close先需要等待,这就是服务器调用close之后会出先端口被占用的情况,因为需要等待一定时间

在创建套解字之后加上表示重复使用就不会出现服务器先调用close出现端口被占用了
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)