TCP三次握手 四次挥手

三次握手过程

就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

syn是同步报文。  SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

几个必须知道的缩写

syn是同步报文。 

seq是数据包本身的序列号; 

ACK为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段

ack是期望对方继续发送的那个数据包的序列号。 

三次握手图解

  1. 第一次握手:(当SYN=1而ACK=0时,表明这是一个连接请求报文。)Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

总结

(第一次)左边发个J,等右边接受

(第二次)右边收到J 回个J+1,并右边也发个K,给左边。

(第三次)如果左边接收到了,就回个K+1,发给右边

TCP三次握手机制中的seq和ack的值到底是什么意思?

TCP连接的三次握手:

第一次(A--->B),SYN=1,ACK=0,seq=x
第二次(B--->A),SYN=1,ACK=1,seq=y,ack=x+1 //seq为什么是y,ack为什么是x+1?
第三次(A--->B),               ACK=1,seq=x+1,ack=y+1 //seq为什么是x+1,ack为什么是y+1?

解释: 

seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。
在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

 syn是同步报文, seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。

TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK

四次挥手

简单示意图

作者:天禾裕
链接:https://www.nowcoder.com/discuss/76933?type=2&order=3&pos=18&page=1
来源:牛客网

关闭连接时,当收到对方(客户端)的FIN报文时,仅仅表示对方(客户端)不再发送数据了但是(客户端)还能接收数据,己方(服务端)也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方(客户端)来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

原文地址:https://www.cnblogs.com/volvane/p/9455869.html