TCP连接状态

这几天遇到了一个建立了socket连接不能轻易释放的问题,所以借此机会把TCP相关的知识整理一下。


1、概念

TCP,全称是Transmission Control Protocol,即传输控制协议,介于应用层和网络层之间,将应用层的数据字节流打包交给网络层进行传输。

TCP是面向连接的,可靠的传输协议。

为了实现可靠:

  • 为了确保数据的准确性与合法性,接收端和发送端都要通过校验和函数对TCP报文进行校验,同时可以使用MD5对数据进行加密。
  • 为了确保数据不丢失,采用超时重传和确认机制,每个TCP报文都有一个自己的序号,方便接收端对报文重新组装,同时也方便对成功接收到的报文进行确认。如果发送方收不到确认会根据序号重传丢失的报文。
  • 在流量控制上,采用滑动窗口协议。
  • 在拥塞控制上,采用AIMD算法。该算法主要包括三个主要部分:1)加性增、乘性减;2)慢启动;3)对超时事件做出反应。
TCP的报文如下图所示

2、状态的切换(3次握手,4次挥手)

TCP协议总共有11种可能的状态,初始状态是CLOSED,传输数据的状态是ESTABLISHED,建立连接的状态包括LISTEN, SYN_SENT,SYN_RCVD,断开连接的状态包括FIN_WAIT_1, CLOSE_WAIT, FIN_WAIT_2, LAST_ACK, TIME_WAIT, CLOSING。
状态切换如下图所示


其中有两个状态比较特殊
  • 同时打开:正好A和B都要与对方建立连接,同时向对方发送列SYN报文,其中一方在收到SYN报文后发送SYN+ACK报文即建立连接。
  • 同时关闭:正好A和B都要通知对方断开连接,同时向对方发送列FIN报文,其中一方向另一方发送一个ACK报文即进入CLOSING状态,如果收到ACK然后再进入TIME_WATI状态

3、两个问题

3.1 为什么建立连接需要3次握手,而断开连接需要4次挥手
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

3.2 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
=====================================================================================================================
今天看HTTP与FTP的区别的时候,把这部分重新看了一下,子曰:温故而知新。圣人诚不我欺啊,看完后,突然发现这部分其实很简单。三次握手,四次挥手都是很有道理的。
三次握手就是这样:
A与B合作完成一件事,双方为了确认对方均以处于就绪状态,A先问B:你准备好了吗(SYN)?B若没问题就跟A说:我准备好了,你呢(ACK+SYN)?A若没问题就跟B说,准备好了(ACK),然后A、B两哥们就算就算建立连接了。
四次挥手就是这样:
A完事了,没有什么要给B的了,就跟B说:我完事了(FIN)。然后自动转到FIN_WAIT1状态。B听到后,向A发送一个确认信息(ACK),表明我知道你完事了,等着吧,哥可能还有事情要做(CLOSING_WAIT)。A收到B的ACK后,就转到FIN_WAIT2状态等着了。B完事后就跟A说,哥也完事了(FIN),你忙你的吧。A回一个ACK,就转到TIME_WATI状态等着回家了。B收到A发送的ACK,这次合作就算结束了,连接断开。

参考:
http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html
http://blog.chinaunix.net/uid-18933439-id-2808696.html
http://www.2cto.com/net/201209/157577.html
http://baike.baidu.com/link?url=fEvFJOMtbE9Hxj6Vn_FeC8BNPC4Mw10L5Mq3IhK99UfF9s5ScS12lVXgF4s2zNJQ7YjQeV3VOf0MY67_Lb8HH4hDJadDjknlkE-OwNZuBsa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值