现在的位置: 首页 > 综合 > 正文

【TCPIP】握手挥手详解

2018年01月12日 ⁄ 综合 ⁄ 共 1392字 ⁄ 字号 评论关闭

一、通信用的一些标志

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

抱歉!评论已关闭.