TCP三次握手建立连接和四次挥手断开连接(个人理解)
TCP协议通过三次握手的方式建立连接:
1.客户端(李二狗)发送SYN请求给服务器(小红):喂,小红,我是李二狗,我想和你说话
2.服务器收到SYN,并回复给客户端一个确认字段ACK:(我是小红),我听到了
3.客户端收到ACK字段,发送第二个SYN请求给服务器:嘿嘿,小红,我听到了,咱俩开聊吧,嘻嘻!
于是服务器将这个连接状态更改为established,并将连接加入backlog队列,等待应用层收取数据包。
三次握手的目的是互相确认双方之间的信道畅通,有互相发送消息的能力,不是聋子或者哑巴。
TCP协议通过四次挥手断开连接:
还是李二狗和小红,这次要说再见了:
1.客户端(李二狗)发送FIN请求给服务器(小红):小红我有点事儿先不跟你聊了吧,咱俩挂断吧,你还有啥想说的吗
2.服务器收到FIN,立刻回复一个确认字段ACK:嗯,那行吧。
3.服务器紧接着主动向客户端发送一个FIN请求:我也没啥想说的了,今天咱先这样吧。
4.客户端收到服务器发送的FIN请求,再次回复一个ACK确认字段:好,再见。
随后客户端仍然需要继续等待2MSL的时间,期间没有收到任何回复,再彻底断开连接。2MSL是网络报文在网络上存活的最长时间,一般是一个经验值,从30秒到几分钟不等:我再等等吧,万一小红那边有什么事没说呢,啊,等30秒了,什么也没收到,她应该确实是挂断了,我也挂了吧
双方就通过这样四次交互彻底断开连接。
之所以要四次挥手,就是要保证双方都收到了彼此的断开确认
要点:
1.如果因为网络故障,客户端多次发送了FIN,那么只要收到一个服务器的ACK,就可以确认服务器知道要断开了。如果服务器先回复FIN,那么客户端就不能保证这个FIN是因为自己发送的FIN而触发的。所以服务器必须先回复ACK
2.如果服务器不回复ACK,那么客户端可以继续单方面接收服务器发送的任何信息,这种连接叫做半连接
3.客户端在收到服务器的FIN之后,不回复ACK,服务器也可以继续单向接收客户端的信息,也继续保持半连接。
4.最后一个ACK,服务器因为网络故障,很久才收到,或者没有收到,只要在2MSL的时间内,都可以再次向客户端发送一次FIN,再确认一次,反复确认直到双方都确实断开了连接。
5(重点,考试要考的).在2MSL时间内,双方原来使用的通信端口不能再次建立连接,任何试图绑定该端口的SOCKET请求都会失败。因此,服务器应该设置允许2MSL复用端口,客户端应选择新的端口与服务器建立连接(一般操作系统会随机生成一个新端口,用户不必操心)
TCP协议这样设计的目的,就是为了最大限度的保证网络连接的可靠性。
以上都是个人的理解,凭借记忆的知识点手敲出来的,如有纰漏和错误请见谅