网络协议系列之十:TCP连接的建立与释放

TCP连接的建立(三次握手)

1> 客户端发送(主动)一个SYN给服务端(相当于告诉服务端,我要打开连接了,你注意一下)。客户端的状态变化:CLOSED–> SYN_SENT,服务端状态变化:CLOSED–>LISTEN;
2> 服务端收到SYN报文,发送SYN+ACK两个报文给客户端,其中ACK报文是对客户端发来的SYN报文的确认(相当于告诉客户端,我收到你的连接请求了)。而这里的SYN报文则是服务端主动给客户端发送的请求连接报文(相当于告诉客户端,我要和你建立连接了,你注意一下)。服务端的状态变化:LISTEN–>SYN RECEIVED,客户端的状态无变化
3> 客户端收到服务端的SYN+ACK报文,就知道服务端同意自己的连接请求。接着处理SYN报文,就知道服务端要与自己建立连接,于是发送一个ACK报文(相当于告诉服务端,我同意了你的连接请求,让我们愉快的玩耍吧)。服务端收到客户端的ACK报文后,双方的连接就建立起来了。客户端的状态变化:SYN_SENT–>ESTABLISHED;服务端的状态变化:SYN RECEIVED–>ESTABLISHED

TCP连接的释放(四次挥手):

1> 客户端操作结束后,发送FIN报文给服务端(相当于告诉服务端,我要断开连接了)。服务端状态变化:ESTABLISHED–>CLOSE_WAIT,客户端的状态变化:ESTABLISHED–>FIN_WAIT_1;
2> 服务端收到客户端的FIN报文后,知道客户端要断开连接了,发送一个ACK报文(注意:服务端并没有发送FIN报文,表示服务端还没有准备好断开连接。相当于告诉客户端,我知道了,但是我的数据还没有处理完毕,你再等等呗);
3> 客户端收到ACK 报文后,知道服务端收到了自己的断开连接的请求。但是服务端还没有准备断开,那就等呗。客户端的状态变化:FIN_WAIT_1–>FIN_WAIT_2;
4> 服务端传送完毕之后,给客户端发送一个FIN报文(相当于告诉客户端,我也传送数据完毕,准备断开连接了,状态由CLOSE_WAIT–>LAST_ACK),客户端收到FIN报文后,发送一个ACK报文(好了,我知道了。但是客户端担心服务端收不到自己的ACK报文,所以就启动一个计时器,状态由FIN_WAIT_2–>TIME_WAIT),等待的时候是2MSL(也就是2倍最长报文生存时间)。如果超过这个时间,服务器没有发送重传ACK报文的请求,就认为服务端已经收到了自己ACK报文,所以就关闭自己的连接,状态由TIME_WAIT–>CLOSED。服务端如果收到了ACK报文,那么就断开自己的连接。状态由LAST_ACK–>CLOSED。如果ACK报文发生了丢失,就发送一个重传请求,客户端就会重新发送一个ACK报文,并重置计时器。

上一篇:MySQL数据库进阶实战-学习报告


下一篇:jsp连接SQL Server 2000数据库代码