zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    23种设计模式(12):策略模式
    23种设计模式(11):责任链模式
    23种设计模式(10):命令模式
    23种设计模式(9):访问者模式
    23种设计模式(8):观察者模式
    23种设计模式(7):中介者模式
    23种设计模式(6):模版方法模式
    创建型模式总结
    23种设计模式(5):原型模式
    leetcode6
  • 原文地址:https://www.cnblogs.com/xiami303/p/2502021.html
Copyright © 2011-2022 走看看