【TCPIP】握手挥手详解
一、通信用的一些标志
SYN:同步标志(Synchronize)
ACK:确认标志(Acknowledgement)
RST:复位标志(Reset)
URG:紧急标志(Urgent)
PSH:推标志(Push)
FIN:结束标志(Finish)
二、三次握手
1、第一次握手:建立连接时,客户端A发送SYN(SYN=j)包到服务器B,并进入SYN_SEND状态,等待服务器B确认。
2、第二次握手:服务器B受到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK
包,此时服务器B进入SYN_RECV状态。
3、第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入
ESTABLISHED状态,完成三次握手。
完成三次握手,客户端和服务器开始传送数据。
三、四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止
这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
挥手过程:
1、客户端A发送一个FIN,用来关闭客户端A到服务器B的数据传送。
2、服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3、服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4、客户端A发回ACK报文去人,并将确认序号设置为收到序号加1。
四、一些问题
1、为什么建立连接是三次,而关闭连接是四次?
a:因为服务器的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,可以将ACK和SYN放在一个报文来发送。
关闭时,收到对方FIN时,它仅仅表示对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了,所以分开发送。
2、为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
a:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态,但是因为我们必须
要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因为对方处理LAST_ACK状态下的SOCKET
可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发肯那个丢失的ACK报文。
3、时间?
a:2msl,大约1~4分钟,和具体操作系统有关。
4、Listen的最大连接数含义?
a:表示的是最大并发连接数。
ServerSocket.Listen(5)中的数目5是指服务方socket的监听队列长度。一旦某个连接到达server,server首先将该连接
放置于此队列中,随后由accept从该队列取出一个连接创建处理线程进行处理,这样队列又空出了一个位置。由于accept速度
足够快,一般不会出现队列满的情况。但是如果客户端并分连接server,这种情况会很常见的,你可以试试并发10个客户端
连接,结果会是不一样的。
链接:http://hi.baidu.com/packetslost/blog/item/ea8bc9c398be9551b219a836.html