weijiyang / GOOD-IDEA

这里记录一些灵感~详见ISSUES
1 stars 0 forks source link

TCP的三次握手 & 四次挥手 #51

Open weijiyang opened 4 years ago

weijiyang commented 4 years ago

一、三次握手讲解

  1. 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)
  2. 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)
  3. 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了) 二、为什么http建立连接需要三次握手,不是两次或四次? 答:三次是最少的安全次数,两次不安全,四次浪费资源;

三、TCP关闭连接过程

  1. Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。

  2. Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。

  3. Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。

  4. Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。

  5. Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。

  6. Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

四、为什么要四次挥手? TCP是全双工信道,何为全双工就是客户端与服务端建立两条通道,通道1:客户端的输出连接服务端的输入;通道2:客户端的输入连接服务端的输出。两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通道的时候就是这样:

客户端:我要关闭输入通道了。 服务端:好的,你关闭吧,我这边也关闭这个通道。

服务端:我也要关闭输入通道了。 客户端:好的你关闭吧,我也把这个通道关闭。

weijiyang commented 4 years ago

简单来说

三次握手

  1. 保证客户端有发送请求的能力
  2. 保证服务端有接收请求和发送请求的能力
  3. 保证客户端有接收请求的能力

四次握手

tcp为双全工信道 客户端和服务端之间有两条通道 第一条 是客户端的输入和服务端的输出 第二条是客户端的输出和服务端的输入

  1. 客户端告诉服务端 我要关闭这边的输出
  2. 服务端接收到并告知我这边也会关闭输入 关闭该通道
  3. 服务端告诉客户端 我这边要关闭输出
  4. 客户端接收并告知我这边也会关闭输入 关闭该通道