三次握手
第一次握手:
建立连接。客户端发送连接请求报文段,将SYN设置为1、Seq设置为x。接下来客户端进入SYN_SENT状态,等待服务端确认。
第二次握手:
服务端收到客户端的SYN报文段,对SYN报文段尽心确认,设置ACK为x+1也就是Seq+1,同时自己还要发送SYN请求信息,将SYN设置为1,seq设为y,服务端将上述信息放到SYN+ACK报文段中,一并发送给客户端,此时服务端进入SYN_RCVD状态。
第三次握手:
客户端收到服务端的SYN+ACK报文段,然后将ACK设置为y+1,向服务端发送ACK报文段,发送完后,客户端和服务段都进入ESTABLISHED即TCP连接成功状态,完成TCP的三次握手,接下来就是数据的传输。
形象理解:
张三找李四借钱:
第一次握手:张三开口问李四借钱,张三进入焦急的等待状态。
第二次握手:李四收到张三的借钱信息后,心里做了一个确认,确认自己有多余的钱可以借给别人,并确认了张三是一个能借钱给他的人。确认了后告诉张三,可以借钱给它。
第三次握手:张三收到李四的回复后很高兴,并把银行卡号发送给了李四。发送结束后张三和李四都进入了等待状态。
握手结束后,服务端和客户端就可以进行数据传输了,数据传输结束后,断开连接时就需要进行TCP的四次挥手告别。
四次挥手
第一次挥手
客户端设置seq和ACK,想服务端发送一个FIN报文段,此时客户端进入FIN_WAIT_1状态,表示客户段没有数据要发送给服务端了。
第二次挥手
服务端收到客户端发送的FIN报文段,向客户端回了一个ACK报文段。
第三次挥手
服务端又向客户端发送FIN报文段,请求关闭连接,同时服务端进入LAST_ACK 状态。
第四次挥手
客户端收到服务端发送的FIN报文段,向服务端发送ACK报文段,然后客户端进入TIME_WAIT状态。服务端收到客户端的ACK报文段后,就关闭连接了。此时,客户端等待2MSL后依然没有收到回复,则说明服务端已正常关闭,这样客户端也可以关闭连接了。
形象理解
张三找李四借钱了N久后准备还钱(结束借钱的状态,对应客户端和服务端之间的数据传输结束。)
第一次挥手:张三告诉李四,请求还钱给他。
第二次挥手:李四回答张三,接受还款。
第三次挥手:李四把银行卡号发给了张三,要求转钱并结束借钱状态。
第四次挥手:张三收到李四的银行卡号之后,把钱转了过去,李四收到钱后就结束了两者之间的借钱关系,把借条撕了。此时张三等了一段时间后没收到李四的任何消息,就知道李四已经收到钱了(借助哪部古装剧中的台词:没有消息就是好消息。),此时张三自己也把心里的借钱状态给取消了。