精华内容
下载资源
问答
  • TCP建立连接和关闭连接的过程

    千次阅读 2018-03-07 18:11:56
    先来一张图看看整个连接和关闭的过程: 各个状态的意义如下: LISTEN:侦听来自远方TCP端口的连接请求; SYN-SENT:在发送连接请求后等待匹配的连接请求; SYN-RECEIVED:在收到和发送一个连接请求后等待对...

    先来一张图看看整个连接和关闭的过程:
    TCP建立连接和关闭连接的过程

    各个状态的意义如下:
    LISTEN:侦听来自远方TCP端口的连接请求;
    SYN-SENT:在发送连接请求后等待匹配的连接请求;
    SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认;
    ESTABLISHED:代表一个打开的连接,数据可以传送给用户;
    FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
    FIN-WAIT-2:从远程TCP等待连接中断请求;
    CLOSE-WAIT:等待从本地用户发来的连接中断请求;
    CLOSING:等待远程TCP对连接中断的确认;
    LAST-ACK: 等待原来发向远程TCP的连接中断请求的确认;
    TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认;
    CLOSED : 连接已经关闭的状态;

    TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

    建立连接的过程

    (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状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据。
    确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。

    关闭连接的过程

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
    (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
    (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
    (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    深入理解TCP连接的释放

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。
    简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
    1.服务器读通道关闭
    2.客户机写通道关闭
    3.客户机读通道关闭
    4.服务器写通道关闭

    关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。
    详细过程:

    第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
    1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
    2.客户机收到ACK(i+1)后,关闭客户机写通道;
    (此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)
    第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
    3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
    4.服务器收到ACK(j+1)后,关闭服务器写通道。

    这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。
    FIN标识是通过发送最后一块数据时设置的,标准的例子中,服务器还在发送数据,所以要等到发送完的时候,设置FIN(此时可称为TCP连接处于半关闭状态,因为数据仍可从被动关闭一方向主动关闭方传送)。如果在服务器收到FIN(i)时,已经没有数据需要发送,可以在返回ACK(i+1)的时候就设置FIN(j)标识,这样就相当于可以合并第二步和第三步。

    常见的三种TCP状态

    SYN_RECV
    服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。

    有两个相关系统配置:
    1,net.ipv4.tcp_synack_retries :INTEGER
    默认值是5

    对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。

    2,net.ipv4.tcp_syncookies
    一般服务器都会设置net.ipv4.tcp_syncookies=1来防止SYN Flood攻击。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。

    这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN Flood攻击。

    能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

    CLOSE_WAIT
    发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发出ACK的TCP状态是CLOSE_WAIT。出现这种状况一般都是由于server端代码的问题,如果你的服务器上出现大量CLOSE_WAIT,应该要考虑检查代码。

    TIME_WAIT
    根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态。TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒。TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。

    为什么需要TIME_WAIT?
    TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。

    为了方便描述,我给这个TCP连接的一端起名为Client,给另外一端起名为Server。上图描述的是Client主动关闭的过程,FTP协议中就这样的。如果要描述Server主动关闭的过程,只要交换描述过程中的Server和Client就可以了,HTTP协议就是这样的。

    描述过程:
    Client调用close()函数,给Server发送FIN,请求关闭连接;Server收到FIN之后给Client返回确认ACK,同时关闭读通道(不清楚就去看一下shutdown和close的差别),也就是说现在不能再从这个连接上读取东西,现在read返回0。此时Server的TCP状态转化为CLOSE_WAIT状态。
    Client收到对自己的FIN确认后,关闭 写通道,不再向连接中写入任何数据。
    接下来Server调用close()来关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭读通道,进入TIME_WAIT状态。
    Server接收到Client对自己的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSED,也就是关闭连接。
    Client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP协议关闭连接过程彻底结束。

    以上就是TCP协议关闭连接的过程,现在说一下TIME_WAIT状态。
    从上面可以看到,主动发起关闭连接的操作的一方将达到TIME_WAIT状态,而且这个状态要保持Maximum Segment Lifetime的两倍时间。为什么要这样做而不是直接进入CLOSED状态?

    原因有二:
    一、保证TCP协议的全双工连接能够可靠关闭
    二、保证这次连接的重复数据段从网络中消失

    先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

    再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

    参考:
    https://www.cnblogs.com/Jessy/p/3535612.html

    展开全文
  • tcp长连接和短连接

    千次阅读 2013-08-20 11:21:05
    接触TCP/IP通信设计的人根据范例可以很快编出一个通信程  序,据此一些人可能会认为TCP/IP编程很简单。其实不然,  TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在  通信方式和报文格式的多样性上...
    刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程  
    
    序,据此一些人可能会认为TCP/IP编程很简单。其实不然, 
    TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 
    通信方式和报文格式的多样性上。 


    一。通信方式 
    <
    展开全文
  • 1.第一种:可用驱动中有QMYSQL这个驱动,但是不能加载(尝试qt连接mysql的没有复制文件到指定文件夹的不存在这种情况) 2.第二种:可用驱动中没有MYSQL驱动,并且不能加载(第一次尝试基本都是这种报错) 二...

    本篇教程分为三个部分:

    1. 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(一、编译连接前准备)
    2. 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(二、编译连接)
    3. 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(三、问题整理)

    阅读本文之前需要先查看我的第一篇文章:

    【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(一、编译连接前准备)

     

    一、测试结果(测试连接代码在第一篇文章中)

    1.第一种:可用驱动中有QMYSQL这个驱动,但是不能加载(刚尝试qt连接mysql的没有复制文件到指定文件夹的不存在这种情况)

     

    2.第二种:可用驱动中没有MYSQL驱动,并且不能加载(第一次尝试基本都是这种报错)

     

    二、编译连接过程

    从上述结果报错结果可以知道我们没有MYSQL驱动,那去哪找到mysql驱动呢?QT5.13.2和QT5.14.1两个版本都提供了编译MYSQL驱动的源码,只需要结合我们自己电脑上安装的MYSQL的库文件就可以编译属于自己的MYSQL驱动,MYSQL安装见前一篇文章。

    1、找到QT上编译MYSQL驱动的源码

    源码的位置在(以qt5.13.2版本为例):F:\Qt\Qt5.13.2\5.13.2\Src\qtbase\src\plugins\sqldrivers\mysql(小伙伴找到qt目录,安装这个文件夹顺序找)

    可以看到有以下六个文件,mysql文件夹是我自己备份的文件夹,建议大家在操作之前也进行备份。要是没有这个文件夹可能是安装时选择的组件不足,可以重新安装选择所有组件。

     

    2.用qt打开这个mysql.pro工程文件

    打开以后会出现配置项目选择哪一种编译器的界面,这里就需要查看你自己安装的MYSQL是32位还是64位的,如果是64位的MYSQL,则需要用64位的编译器,即Desktop Qt 5.13.2 MinGW 64-bit,本文采用的是32位的。

     

     

    3.右击项目选择重新构建项目如下图

     

    会出现下面报错:

     

    需要我们将 QMAKE_USE += mysql 这句话注释掉

     

    4.注释掉后,再次进行重新构建项目

    会出现以下错误:

     

    主要是因为我们没有mysql.h这个文件,那么这个文件在哪?在我们自己安装的mysql里面,在sql安装目录的include下(我的路径:F:\MySQL\MySQL Server 5.5\include)。

     

    所以需要我们在.pro文件添加这些路径,也即加上下面这两句话,路径是我自己的,需要改成你们自己的:

    INCLUDEPATH+="F:\MySQL\MySQL Server 5.5\include"
    LIBS+="F:\MySQL\MySQL Server 5.5\lib\libmysql.lib"

     

    5.加上这两句话后再次进行重新构建

    (1)出现下面的bug表示你用的qt MinGW 位数与MYSQL位数不一致

     

     

    (2)若出现下面的bug,若是不出现可能就表示编译出驱动,直接看第六步。

     

    这个bug下面图片上的这句话有关系,我测试的时候原来的相对路径不好用,所以我才用的绝对路径,大家可以自由选择,改成自己文件的路径即可。

     

    我们按照这个路径打开这个文件(用记事本即可)可以看到include里面的qtsqldrivers-config.pri文件并不存在,而存在configgure.pri这个文件,所以我们将include包括的文件改成configgure.pri这个文件,即改为:include(./configure.pri)

     

     

     

    6.再次进行重新构建,构建过程可以查看“4编译输出”这一栏的输出

    出现下面的结果就表示我们编译成功了!

     

    7.编译成功以后就可以直接去找我们编译成功后的驱动,因为我们没有设置输出目录所以默认在qt安装的盘下,比如我的qt在F盘,所以这个输出也在F盘,路径:F:\plugins\sqldrivers

     

     

    8.将编译好的驱动(所有文件复制过去就行,省事)放到对应的MinGW编译器的文件夹中,我用的32位的就放在:F:\Qt\Qt5.13.2\5.13.2\mingw73_32\plugins\sqldrivers中,64位的就在F:\Qt\Qt5.13.2\5.13.2\mingw73_64\plugins\sqldrivers中。

     

    9.编译测试代码,注意是测试代码,不是上边的mysql代码。测试代码见第一篇文章。注意编译也需要用对应的编译器,生成是32位的就要用32位的编译器,64位的就是64位的编译器。

     

    结果如下,这表示已经存在驱动,但是还没有加载,还需要我们从mysql的安装目录复制文件到MinGW的文件夹中。

     

    10.将F:\MySQL\MySQL Server 5.5\lib中的libmysql.dll与libmysql.lib复制到mingw的bin文件夹中即:F:\Qt\Qt5.13.2\5.13.2\mingw73_32\bin。

     

     

    11.再次对测试代码进行测试发现成功!

     

    部分报错问题请查看第三篇文章:【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(三、问题整理)

    转载参考分享此篇文章请注明出处!

    展开全文
  • TCP建立连接和断开连接过程

    千次阅读 2017-08-24 16:32:45
    假设Client端发起中断连接请求,也就是发送FIN报文。 Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。 所以你先发送...

    TCP三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:


    TCP三次握手.png

    (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    简单来说,就是

    1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

    2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

    3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

    SYN攻击

    在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

    #netstat -nap | grep SYN_RECV

    TCP四次挥手

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:


    TCP四次挥手.png

    由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

    (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

    (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    原因有二:
    一、保证TCP协议的全双工连接能够可靠关闭
    二、保证这次连接的重复数据段从网络中消失

    先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

    再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

    假设Client端发起中断连接请求,也就是发送FIN报文。

    Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。

    所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。

    当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。

    Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。

    “Server端收到ACK后,就知道可以断开连接了"。

    Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭。

    那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

    *SYN:同步标志
    同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。
    
    *ACK:确认标志
    确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。
    *FIN:结束标志
     带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据


    展开全文
  • TCP长连接与短连接的区别

    千次阅读 2015-02-11 23:50:50
    TCP/IP  TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。  在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。  在传输层中有TCP协议与UDP协议。...连接->传输数据->关闭连接
  • tcp断开连接为什么是4次挥手

    千次阅读 2019-06-05 08:56:19
    经过上次的聊天后,司马和上官成为了好朋友,今天,司马又给上官发消息了,但是这次,两人建立连接后,同时给对方发送了一个报文“在吗?”,导致过了一会,司马和上官都收到对方的“在吗?”如下图: 在聊天完后...
  • 建立连接理解: 1、TCP的流量控制 2、TCP使用窗口机制进行流量控制 3、什么是窗口? 连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的...
  • 使用扫描仪时得到连接失败的错误信息,导致正常扫描失败怎么办?首先确定扫描仪属于哪个接口,然后按照以下步骤进行检查以消除问题:1.scsi接口(1)请确认扫描仪的光学锁是否已打开。(2)请确认扫描仪后面板的scsi id...
  • C3P0连接池的配置与使用

    万次阅读 2019-03-22 23:08:01
    连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。 基本原理是这样的: (1)建立...
  • mongos 连接数问题解析

    千次阅读 2019-04-30 17:29:46
    笔者:李大 ...文章目录客户端到 mongos 的连接连接每线程adaptive 线程池mongos 的连接池相关结构传统连接池的使用相关结构使用TaskExecutor 与 TaskExecutorPoolconnPoolStats 与 shardConnPoolStats ...
  • a、我们打开的界面是这样的: b、点击左上角按钮,找到轻量应用服务器 点击后,会进入你的服务器列表界面。 c、这是你的服务器列表界面 2、拿到你的信息 点击左侧的远程连接。下图所示,...
  • android长连接的所有方式及分析

    千次阅读 2019-02-17 20:42:30
    文章目录实现长连接的方式方案优缺点比较push原理及实现主流app常用方案:1. 使用第三方的长连接服务2. 使用NIO等方案实现长连接服务3. 使用MINA等第三方框架实现长连接4.websocket实现及才坑记录 实现长连接的方式...
  • Android 蓝牙遥控器的连接

    千次阅读 2017-09-20 16:02:02
    开始接手的时候以为会很快完成,无非就是调用API吗?可是事实不是这样,前后花了一些时间,才解决。 好了,当时尝试了Socket连接以及低功耗连接BLE,事实证明都不可行,后来就在想设置界面是怎么连接的呢,终于...
  • HTTP协议浅谈(一)之TCP长连接

    万次阅读 多人点赞 2017-10-12 21:21:40
    接触HTTP请求就听说过HTTP请求有1.0和1.1两个版本(其实还有个0.9版本,因为只接受GET一种请求,不支持POST方法,因此客户端无法向服务器传递太多信息而为人们所忽略),而且还知道HTTP1.0协议不支持长连接,从...
  • 参照: ...  建立连接:  理解:窗口和滑动窗口TCP的流量控制 TCP使用窗口机制进行流量控制 什么是窗口? 连接建立时,各端分配一块缓冲区用来存储接收的数据,并将
  • Redis连接池无法正常释放连接,抛出异常:IllegalStateException: Invalidated object not currently part of this pool 线程不安全,导致创建多个连接池,发生错误归还。
  • TCP的三次握手(建立连接)和四次挥手(关闭连接) 参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/944d23d9b502d13be3108f61   建立连接:  理解:...
  • jdbc桥连接过程解析

    千次阅读 2015-02-08 04:13:52
    读多少源码,便知自己有多无知! 觉得应该找个在Java中桥连接模式的实际应用,于是就找到了Jdbc连接。 于是,困惑和解惑的旅程开始了.......
  • ip层netfilter的连接跟踪模块

    千次阅读 2015-12-09 12:10:20
    连接跟踪(CONNTRACK)就是跟踪并且记录连接状态。包括 TCP 、UDP、ICMP 等协议类型的连接。其主要是判断该数据包是什么状态。根据数据包的源ip地址、目的ip地址、源端口、目的端口、协议号来确定一条连接。   ...
  • Netfilter之连接跟踪实现机制初步分析 什么是连接跟踪 连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新...此后,所有属于连接的数据包都被唯一地分
  • 虚拟机的三种网络连接方式

    千次阅读 2018-01-04 14:31:52
    VirtualBox中有4中网络连接方式: a. NAT 网络地址转换模式(Network Address Translation) b. Bridged Adapter 桥接模式 c. Internal 内部网络模式 d. Host-only Adapter 主机模式 V
  • java连接opcserver

    千次阅读 2020-01-19 14:37:30
    这步我卡了很久,开始一直搜索不到服务器上的opc,没有任何提示信息,于是检查windows服务器的登录安全日志,发现一直报错登录失败,找不到用户,发现虚拟机里登录的用户admin,在服务器上并不存在,于是在服务器...
  • 前言 ...2、简单快速;3、灵活;4、无连接;5、无状态。其中无状态是其中主要特点之一。...所谓的无状态是指协议对于事务处理没有记忆...发现很多地方,将http的无连接与无状态混为一团,让初学者一时陷入雾水(比如我...
  • VirtualBox的四种网络连接方式

    万次阅读 2017-02-08 20:57:08
    VirtualBox中有4中网络连接方式
  • DirectShow中用好智能连接

    千次阅读 2009-01-14 18:11:00
    为了达到要求,Filter Graph要按照事先已确定的一种链路来建立,所以开始时我在程序中将Filter逐个进行连接,即创建一个,再连接一个,这样虽然能构建出事先确定的链路,但很麻烦,代码冗长,而且在每打开一个媒体...
  • 如何理解Netfilter中的连接跟踪机制

    千次阅读 2013-01-23 22:05:23
    连接跟踪定义很简单:用来记录和跟踪连接的状态。 为什么又需要连接跟踪功能呢?因为它是状态防火墙和NAT的实现基础。 Neftiler为了实现基于数据连接状态侦测的状态防火墙功能和NAT地址转换功能才开发出了连接...
  • java服务器搭建(二)数据库连接

    千次阅读 2014-05-09 14:33:15
    java连接数据库
  • 手把手教你写 Socket 长连接

    千次阅读 2018-06-29 15:04:18
    本文由玉说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号 玉说 ...最后我们聊聊偏高级一点点的 socket 长连接和协议设计。 TCP/IP 协议简介 IP 首先我们看 IP(Internet Protoc...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,426
精华内容 25,770
关键字:

属于刚连接的是