TCP的连接和建立
TCP报文格式
TCP的连接和建立主要关注报文中的几个字段
字段 | 长度(bit) | 含义 |
---|---|---|
序号 | 32 | TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 |
确认号 | 32 | 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。 |
ACK | 1 | 确认号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 |
SYN | 1 | 同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。 |
FIN | 1 | 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 |
三次握手
TCP/IP采用三次握手来建立连接
过程 | 报文 | 含义 |
---|---|---|
第一次握手 | SYN = 1, seq = x | Client向Server发送一个连接请求 SYN = 1(表示这个报文是一个连接请求),同时发送自己的序号seq = x |
第二次握手 | SYN = 1, ACK = 1, ack = x + 1, seq = y | 收到Client发来的报文,回复Client一个确认报文作为应答 ACK = 1(确认报文),接着发送一个确认号ack = x + 1(+1是代表它收到了SYN标识),SYN = 1(代表连接接受请求),同时发送自己的序号seq = y |
第三次握手 | ACK = 1, ack = y + 1 | Client收到Server的响应报文,它也要回复确认报文 ACK = 1(代表确认报文),ack = Y + 1(对方的序号+1,表示收到对方的SYN标识) |
注:为啥要3次握手
前两次握手 客户端可以知道服务器可以收到报文,也可以发送给我,但是服务器并不知道客户端能否收到,所有需要三次握手,即客户端再发送一个确认报文
四次挥手
TCP/IP采用四次挥手来关闭连接
过程 | 报文 | 含义 |
---|---|---|
第一次挥手 | FIN = 1, seq = x | Client发送一个FIN = 1的包(代表要释放连接),同时发送自己的序号 seq = x |
第二次挥手 | ACK = 1, ack = x + 1 | Server收到Client的FIN包,则发送一个确认包,表示自己接受到Client的关闭连接请求(还没准备好关闭连接) |
第三次挥手 | FIN = 1, seq = y | 当Server准备好关闭连接时,向Client发送结束连接请求,FIN置为1,同时发送自己的序号seq = y |
第四次挥手 | ACK = 1, ack = y + 1 | Client接收到Server的关闭请求,发送一个确认包,Server收到确认包,就会关闭连接,进入CLOSED状态,Server关闭后,将不再回应Client,Client等待某个时间后,将会自行关闭,进入CLOSED状态,这时完成TCP连接释放 |