1、三次握手
置位概念:依据 TCP 的包头字段,存在 3 个重要的标识 ACK、SYN、FIN
ACK:示意验证字段
SYN:位数置 1,示意建设 TCP 连贯
FIN:位数置 1,示意断开 TCP 连贯
三次握手过程阐明:
1、由客户端发送建设 TCP 连贯的申请报文,其中报文中蕴含 seq 序列号,是由发送端随机生成的,并且将报文中的 SYN 字段置为 1,示意须要建设 TCP 连贯。(SYN=1,seq=x,x 为随机生成数值)
2、由服务端回复客户端发送的 TCP 连贯申请报文,其中蕴含 seq 序列号,是由回复端随机生成的,并且将 SYN 置为 1,而且会产生 ACK 字段,ACK 字段数值是在客户端发送过去的序列号 seq 的根底上加 1 进行回复,以便客户端收到信息时,通晓本人的 TCP 建设申请已失去验证。(SYN=1,ACK=x+1,seq=y,y 为随机生成数值)这里的 ack 加 1 能够了解为是确认和谁建设连贯。
3、客户端收到服务端发送的 TCP 建设验证申请后,会使本人的序列号加 1 示意,并且再次回复 ACK 验证申请,在服务端发过来的 seq 上加 1 进行回复。(SYN=1,ACK=y+1,seq=x+1)
2、四次挥手
四次挥手过程阐明:
1、客户端发送断开 TCP 连贯申请的报文,其中报文中蕴含 seq 序列号,是由发送端随机生成的,并且还将报文中的 FIN 字段置为 1,示意须要断开 TCP 连贯。(FIN=1,seq=x,x 由客户端随机生成)
2、服务端会回复客户端发送的 TCP 断开申请报文,其蕴含 seq 序列号,是由回复端随机生成的,而且会产生 ACK 字段,ACK 字段数值是在客户端发过来的 seq 序列号根底上加 1 进行回复,以便客户端收到信息时,通晓本人的 TCP 断开申请曾经失去验证。(FIN=1,ACK=x+1,seq=y,y 由服务端随机生成)
3、服务端在回复完客户端的 TCP 断开申请后,不会马上进行 TCP 连贯的断开,服务端会先确保断开前,所有传输到 A 的数据是否曾经传输结束,一旦确认传输数据结束,就会将回复报文的 FIN 字段置 1,并且产生随机 seq 序列号。(FIN=1,ACK=x+1,seq=z,z 由服务端随机生成)
4、客户端收到服务端的 TCP 断开申请后,会回复服务端的断开申请,蕴含随机生成的 seq 字段和 ACK 字段,ACK 字段会在服务端的 TCP 断开申请的 seq 根底上加 1,从而实现服务端申请的验证回复。(FIN=1,ACK=z+1,seq=h,h 为客户端随机生成)
至此 TCP 断开的 4 次挥手过程结束
3、11 种状态
1、一开始,建设连贯之前服务器和客户端的状态都为 CLOSED;
2、服务器创立 socket 后开始监听,变为 LISTEN 状态;
3、客户端申请建设连贯,向服务器发送 SYN 报文,客户端的状态变味 SYN_SENT;
4、服务器收到客户端的报文后向客户端发送 ACK 和 SYN 报文,此时服务器的状态变为 SYN_RCVD;
5、而后,客户端收到 ACK、SYN,就向服务器发送 ACK,客户端状态变为 ESTABLISHED;
6、服务器端收到客户端的 ACK 后变为 ESTABLISHED。此时 3 次握手实现,连贯建设!
因为 TCP 连贯是全双工的,断开连接会比建设连贯麻烦一点点。
1、客户端先向服务器发送 FIN 报文,申请断开连接,其状态变为 FIN_WAIT1;
2、服务器收到 FIN 后向客户端发送 ACK,服务器的状态围边 CLOSE_WAIT;
3、客户端收到 ACK 后就进入 FIN_WAIT2 状态,此时连贯曾经断开了一半了。如果服务器还有数据要发送给客户端,就会持续发送;
4、直到发完数据,就会发送 FIN 报文,此时服务器进入 LAST_ACK 状态;
5、客户端收到服务器的 FIN 后,马上发送 ACK 给服务器,此时客户端进入 TIME_WAIT 状态;
6、再过了 2MSL 长的工夫后进入 CLOSED 状态。服务器收到客户端的 ACK 就进入 CLOSED 状态。
至此,还有一个状态没有进去:CLOSING 状态。
CLOSING 状态示意:
客户端发送了 FIN,然而没有收到服务器的 ACK,却收到了服务器的 FIN,这种状况产生在服务器发送的 ACK 丢包的时候,因为网络传输有时会有意外。
LISTEN:期待从任何远端 TCP 和端口的连贯申请。SYN_SENT:发送完一个连贯申请后期待一个匹配的连贯申请。SYN_RECEIVED:发送连贯申请并且接管到匹配的连贯申请当前期待连贯申请确认。ESTABLISHED:示意一个关上的连贯,接管到的数据能够被投递给用户。连贯的数据传输阶段的失常状态。FIN_WAIT_1:期待远端 TCP 的连贯终止申请,或者期待之前发送的连贯终止申请的确认。FIN_WAIT_2:期待远端 TCP 的连贯终止申请。CLOSE_WAIT:期待本地用户的连贯终止申请。CLOSING:期待远端 TCP 的连贯终止申请确认。LAST_ACK:期待先前发送给远端 TCP 的连贯终止申请的确认(包含它字节的连贯终止申请的确认)TIME_WAIT:期待足够的工夫过来以确保远端 TCP 接管到它的连贯终止申请的确认。TIME_WAIT 两个存在的理由:1. 牢靠的实现 tcp 全双工连贯的终止;2. 容许老的反复分节在网络中消失。CLOSED:不在连贯状态(这是为不便形容假想的状态,理论不存在)
以上内容心愿帮忙到大家