《深入分析 javaweb 技术内幕》P38 读书扩展
作者:淮左白衣
写于2018年4月12日20:58:36
目录
听了刘德华的《17岁》,华仔在中间喊话:还记不记得我17岁的时候你们多少岁啊?是不是和我一样都是17岁啊?亦是当时只是小孩子啊?莫名哀伤时间流逝
17岁的华仔,那时刚出道!想想我的17岁,青春既没开花,也没喂狗,只是平淡的流走了!没有人永远17岁,但是永远有人17岁!
TCP状态转换图解
TCP的一次通信,分为建立连接(三次握手)、关闭连接(四次挥手);
图解三次握手
实线代表服务器 的状态转换、虚线代表客户端 的转态转换;
文字讲解三次握手:
- 最开始客户端和服务器,都处于
CLOSED
状态,二者之间没有任何联系; - 客户端向服务器发起连接请求,具体操作是发送一个 SYN 给服务器,客户端状态转而变为
SYN-SENT
,这是第一次握手 ; - 由于客户端向服务器发送请求了,服务器被动的进入
LISTEN
状态; - 如果服务器没有想要客户端的请求,则客户端得不到服务器的回应,请求就会超时,一旦请求超时,客户端的状态,就会再次进入
CLOSED
; - 如果服务器响应了这个请求,具体操作是:接收到了客户端发送的 SYN,同时向客户端发送回应 SYN+ACK,表示我收到你的请求了;然后服务器的状态,进入
SYN-RECEIVED
; 这是第二次握手 ; - 客户端收到服务器的回应 SYN+ACK,然后再次向服务器发送一个 ACK,表示我收到你的回应了 ;客户端的状态进入
ESTABLISHED
;这是第三次握手 ; - 服务器收到客户端的响应 ACK 以后,状态进入
ESTABLISHED
; - 至此,三次握手完成,客户端与服务器建立了可靠的连接,可以进行数据传输了 ;
上面有个特殊的地方:
假如客户端发送请求报文SYN的时候,服务器也发送了请求报文SYN ,则客户端进入 SYN-RECEIVED
状态,角色变为服务器; 一般这种情况是,没有绝对的客户端、服务器;通信的两台机器,可以在客户端和服务器之间进行角色的切换 ;
图解四次挥手
实线代表主动关闭方 的状态转换、虚线代表被动关闭方 的转态转换;
文字讲解四次挥手:
- 主动关闭方,发送 FIN 给被动关闭方,然后进入
FIN-WAIT-1
状态 ; - 被动关闭方,收到主动关闭方的 FIN,会送一个回应 ACK 给主动发送方,然后进入
CLOSE-WAIT
; - 主动方收到被动方回应的ACK,并且也回应一个ACK,然后进入
FIN-WAIT-2
; - 既然主动方要关闭连接,那么被动方也不能死皮赖脸的不关啊,它也就向主动方发送一个请求FIN,然后进入
LAST-ACK
; - 被动方收到主动方的回应ACK,进入
CLOSED
主动方收到被动方发送的 FIN 之后,发送回应 ACK(主动方在接收到被动方发送的FIN,将不再接受任何信息,但是可以发送信息),进入
TIME-WAIT
上面是有一方先于对方,发起关闭请求 ,下面说下,双方同时发起关闭请求的情况;
当双方同时发起关闭请求的时候,双方在发送完FIN 以后,都进入
FIN-WAIT-1
状态;然后如果双发又同时收到对方的FIN,以及同时收到对方回应的ACK,则直接进入TIME-WAIT
;
如果双方同时收到FIN,但是没有同时收到ACK,则先进入CLOSING
,然后,在双方都收到 ACK 以后,再进入TIME-WAIT
;
为什么在进入 TIME-WAIT
的状态以后,会等待 2MSL 的时间,再进入 CLOSED
?
MSL 翻译为:报文最大生存时间 ;,2MSL则是两个报文最大生存世时间,等待这个时间的原因:是因为在网络不好的时候,有时候,需要重新发送报文,因此进入这里的等待下 ;