主要的参考博文

1.TCP的三次握手

TCP相关知识点TCP相关知识点

  1. 首先TCP客户端和服务端的状态都是CLOSED状态。
  2. 由服务端建立传输控制块(TCP 连接表),服务端转为Listen(监听状态)。–被动打开连接。
  3. 客户端也同样的建立传输控制块。

  1. 客户端向服务器发送TCP连接请求报文 (
    syn位被设置为1、表明这是一个TCP请求连接报文段,TCP规定syn被设置为1的报文段是不能携带数据的,但需要消耗掉一个序号);
    seq=x,***被设置为x,作为客户进程的初始序号。
    并进入SYN-SENT(同步已发送状态
    )。。。由于是由TCP主动发起的。所以称为主动打开。
  2. 服务端在接收后,确认需要建立连接,向客户端发送连接请求确认报文(
    并将报文中的SYN,ACK同步位都设置为1.标识这是TCP连接请求确认报文,
    seq =y(TCP服务进程所选择的初始***),
    ack=x+1,这是对TCP连接请求初始序号为x的确认。)

    6.客户端在接收确认报文,进入连接已建立状态,然后还需要发送一个普通的TCP确认报文。
    ACK=1:表明这是一个普通的TCP确认报文段。
    seq=x+1
    ack=y+1;这是对TCP服务端选择的初始信号y的确认。
    7.服务端在接收信号后,也进入到连接已建立状态。

2.TCP的四次挥手

TCP相关知识点

2.1 CLOSE_WAIT:

CLOSE_WAIT是被动关闭连接是形成的
客户端发一条FIN(关闭)请求给服务端,说我要关闭了;

服务端回应一条ACK(确认)请求给客户端,说我知道了,你关吧,此时服务端就会进行CLOSE_WAIT状态;
注意:但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

2.2 TIME_WAIT

TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接。作用就是重发可能丢失的报文。
  假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 临重发最终ACK的情形。

为什么是3次握手和四次挥手:

  这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能不会马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

相关文章: