TCP三次握手四次挥手详解
tcp三次握手和四次挥手以及发送数据时的ack和seq关系

tcp三次握⼿和四次挥⼿以及发送数据时的ack和seq关系TCP报⽂格式下⾯是TCP报⽂格式图上图中有⼏个字段需要重点介绍下:1、序号:Seq序号,占32位,⽤来标识从TCP源端向⽬的端发送的字节流,发起⽅发送数据时对此进⾏标记。
2、确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效(Ack=Seq+1)。
3、标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收⽅应该尽快将这个报⽂交给应⽤层。
(D)RST:重置连接。
(E)SYN:发起⼀个新连接。
(F)FIN:释放⼀个连接。
需要注意的是:(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认⽅的Ack=发起⽅的Seq+1,两端配对。
TCP三次握⼿:建⽴⼀个TCP连接时会发⽣下述情形(1)服务器必须准备好接受外来连接。
通常通过socket、bind和listen函数来完成,称之为被动打开(passive open)。
(2)客户通过connect发起主动打开(active open)。
这导致客户TCP 发送⼀个SYN同步分节,它告诉服务器客户将(待建⽴的)连接中发送的数据的初始序列号。
通常SYN不携带数据,其所在IP数据报仅包含IP⾸部、TCP ⾸部以及可能有的TCP 选项。
(3)服务器确认(ACK)客户的SYN,同时⾃⼰发送⼀个SYN分节,它包含服务器将在同⼀个连接中发送数据的初始序列号。
服务器在单个TCP分节中发送SYN和ACK。
(4)客户必须确认服务器的SYN。
注意:服务器的ACK是客户SYN + 1,该ACK中的确认号是发送这个ACK的⼀端期待的下⼀个序列号;这是因为SYN占据⼀个字节的序列号空间;所以每个SYN的ACK中的确认号就是该SYN的初始序列号加1。
同样,每个FIN的ACK中确认号为该FIN的序列号加1。
tcp三次握手与四次挥手

TCP三次握手四次挥手之迟辟智美创作关键字: tcp三次握手四次挥手1.TCP握手协议(简单明了)在TCP/IP协议中,TCP协议提供可靠的连接服务,采纳三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等候服务器确认;第二次握手:服务器收到syn包,必需确认客户的SYN (ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户真个SYN包(syn=j)开设一个条目,该条目标明服务器已收到 SYN包,并向客户发出确认,正在等候客户简直认包.这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户简直认包时,删除该条目,服务器进入ESTABLISHED状态.Backlog参数:暗示未连接队列的最年夜容纳数目.SYNACK 重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等候一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超越系统规定的最年夜重传次数,系统将该连接信息从半连接队列中删除.注意,每次重传等候的时间纷歧定相同.半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等候时间总和.有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间.2.TCP握手协议(详细)TCP/IP 是很多的分歧的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol.可靠的主机到主机层协议.这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种.两个TCP意思非相同. ).TCP是一种可靠的面向连接的传送服务.它在传送数据时是分段进行的,主机交换数据必需建立一个会话.它用比特流通信,即数据被作为无结构的字节流.通过每个TCP传输的字段指定顺序号,以获得可靠性.是在OSI参考模型中的第四层,TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不竭的把报文放到网络上,而TCP是负责确信报文达到.在协同IP的把持中TCP负责:握手过程、报文管理、流量控制、毛病检测和处置(控制),可以根据一定的编号顺序对非正常顺序的报文给予重新排列顺序.关于TCP的RFC文档有RFC793、RFC791、RFC1700.在TCP会话早期,有所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时裁撤联系,并建立虚连接.为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后简直认消息. TCP总是用来发送年夜批量的数据.当应用法式在收到数据后要做出确认时也要用到TCP.由于TCP需要时刻跟踪,这需要额外开销,使得TCP的格式有些显得复杂.下面就让我们看一个TCP的经典案例,这是后来被称为MITNICK攻击中KEVIN开创了两种攻击技术:TCP会话劫持SYN FLOOD(同步洪流)在这里我们讨论的时TCP会话劫持的问题.先让我们明白TCP建立连接的基本简单的过程.为了建设一个小型的模仿环境我们假设有3台接入互联网的机器.A为攻击者把持的攻击机.B为中介跳板机器(受信任的服务器).C为受害者使用的机器(多是服务器),这里把C机器锁定为目标机器.A机器向B机器发送SYN包,请求建立连接,这时已经响应请求的B机器会向A机器回应SYN/ACK标明同意建立连接,当A机器接受到B机器发送的SYN/ACK回应时,发送应答ACK建立A机器与B机器的网络连接.这样一个两台机器之间的TCP通话信道就建立胜利了.B终端受信任的服务器向C机器发起TCP连接,A机器对服务器发起SYN信息,使C机器不能响应B机器.在同时A 机器也向B机器发送虚假的C机器回应的SYN数据包,接收到SYN数据包的B机器(被C机器信任)开始发送应答连接建立的 SYN/ACK数据包,这时C机器正在忙于响应以前发送的SYN数据而无暇回应B机器,而A机器的攻击者预测出B机器包的序列号(现在的TCP序列号预测难度有所加年夜)假冒C机器向B机器发送应答ACK这时攻击者骗取B 机器的信任,假冒C机器与B机器建立起TCP协议的对话连接.这个时候的C机器还是在响应攻击者A机器发送的SYN数据.TCP协议栈的弱点:TCP连接的资源消耗,其中包括:数据包信息、条件状态、序列号等.通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽.通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C机器的资源耗尽.序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK的序列号时可预测的.(早期TCP协议栈,具体的可以拜会1981年出的关于TCP雏形的RFC793文档)TCP头结构TCP协议头最少20个字节,包括以下的区域(由于翻译不由相同,文章中给出相应的英文单词):TCP源端口(Source Port):16位的源端口其中包括初始化通信的端口.源端口和源IP地址的作用是标示报问的返回地址.TCP目的端口(Destination port):16位的目的端口域界说传输的目的.这个端口指明报文接收计算机上的应用法式地址接口.TCP序列号(序列码,Sequence Number):32位的序列号由接收端计算机使用,重新分段的报文成最初形式.当SYN呈现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1.这个序列号(序列码)是可以赔偿传输中的纷歧致.TCP应答号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式.,如果设置了ACK控制位,这个值暗示一个准备接收的包的序列码.数据偏移量(HLEN):4位包括TCP头年夜小,指示何处数据开始.保管(Reserved):6位值域,这些位必需是0.为了将来界说新的用途所保管.标识表记标帜(Code Bits):6位标识表记标帜域.暗示为:紧急标识表记标帜、有意义的应答标识表记标帜、推、重置连接标识表记标帜、同步序列号标识表记标帜、完成发送数据标识表记标帜.依照顺序排列是:URG、ACK、PSH、RST、SYN、FIN.窗口(Window):16位,用来暗示想收到的每个TCP数据段的年夜小.校验位(Checksum):16位TCP头.源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性.优先指针(紧急,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标识表记标帜设置了时才有效.如果URG标识表记标帜没有被设置,紧急域作为填充.加快处置标示为紧急的数据段.选项(Option):长度不定,但长度必需以字节.如果没有选项就暗示这个一字节的域即是0.填充:不定长,填充的内容必需为0,它是为了数学目的而存在.目的是确保空间的可预测性.保证包头的结合和数据的开始处偏移量能够被32整除,一般额外的零以保证TCP头是32位的整数倍.标识表记标帜控制功能URG:紧急标识表记标帜紧急(The urgent pointer) 标识表记标帜有效.紧急标识表记标帜置位,ACK:确认标识表记标帜确认编号(Acknowledgement Number)栏有效.年夜大都情况下该标识表记标帜位是置位的.TCP报头内简直认编号栏内包括简直认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经胜利接收所有数据.PSH:推标识表记标帜该标识表记标帜置位时,接收端不将该数据进行队列处置,而是尽可能快将数据转由应用处置.在处置 telnet 或rlogin 等交互模式的连接时,该标识表记标帜总是置位的.RST:复位标识表记标帜复位标识表记标帜有效.用于复位相应的TCP连接.SYN:同步标识表记标帜同步序列编号(Synchronize Sequence Numbers)栏有效.该标识表记标帜仅在三次握手建立TCP连接时有效.它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号.在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器.通过TCP连接交换的数据中每一个字节都经过序列编号.在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号.FIN:结束标识表记标帜带有该标识表记标帜置位的数据包用来结束一个TCP 回话,但对应端口仍处于开放状态,准备接收后续数据.服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)依照TCP/IP协议仓库组合成为TCP处置的分段(segment).分析报头信息: TCP层接收到相应的TCP和IP报头,将这些信息存储到内存中.检查TCP校验和(checksum):标准的校验和位于分段之中(Figure:2).如果检验失败,不返回确认,该分段抛弃,并等候客户端进行重传.查找协议控制块(PCB{}):TCP查找与该连接相关联的协议控制块.如果没有找到,TCP将该分段抛弃并返回RST.(这就是TCP处置没有端口监听情况下的机制) 如果该协议控制块存在,但状态为关闭,服务端不调用connect()或listen().该分段抛弃,但不返回RST.客户端会检验考试重新建立连接请求.建立新的socket:当处于监听状态的socket收到该分段时,会建立一个子socket,同时还有socket{},tcpcb{}和pub{}建立.这时如果有毛病发生,会通过标识表记标帜位来裁撤相应的socket和释放内存,TCP连接失败.如果缓存队列处于填满状态,TCP认为有毛病发生,所有的后续连接请求会被拒绝.这里可以看出SYN Flood攻击是如何起作用的.抛弃:如果该分段中的标识表记标帜为RST或ACK,或者没有SYN标识表记标帜,则该分段抛弃.并释放相应的内存.发送序列变量SND.UNA :发送未确认SND.NXT :发送下一个SND.WND :发送窗口SND.UP :发送优先指针SND.WL1 :用于最后窗口更新的段序列号SND.WL2 :用于最后窗口更新的段确认号ISS :初始发送序列号接收序列号RCV.NXT :接收下一个RCV.WND :接收下一个RCV.UP :接收优先指针IRS :初始接收序列号以后段变量SEG.SEQ :段序列号SEG.ACK :段确认标识表记标帜SEG.LEN :段长SEG.WND :段窗口SEG.UP :段紧急指针SEG.PRC :段优先级CLOSED暗示没有连接,各个状态的意义如下:LISTEN :监听来自远方TCP端口的连接请求. SYNSENT :在发送连接请求后等候匹配的连接请求.SYNRECEIVED :在收到和发送一个连接请求后等候对连接请求简直认.ESTABLISHED :代表一个翻开的连接,数据可以传送给用户.FINWAIT1 :等候远程TCP的连接中断请求,或先前的连接中断请求简直认.FINWAIT2 :从远程TCP等候连接中断请求.CLOSEWAIT :等候从本地用户发来的连接中断请求.CLOSING :等候远程TCP对连接中断简直认.LASTACK :等候原来发向远程TCP的连接中断请求简直认.TIMEWAIT :等候足够的时间以确保远程TCP接收到连接中断请求简直认.CLOSED :没有任何连接状态.TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS.传送过来的数据段,特别那些包括以下标识表记标帜的数据段SYN,ACK,RST和FIN.还有超时,上面所说的城市时TCP状态发生变动.序列号请注意,我们在TCP连接中发送的字节都有一个序列号.因为编了号,所以可以确认它们的收到.对序列号简直认是累积性的.TCP必需进行的序列号比力把持种类包括以下几种:①决定一些发送了的但未确认的序列号.②决定所有的序列号都已经收到了.③决定下一个段中应该包括的序列号.对发送的数据TCP要接收确认,确认时必需进行的:SND.UNA = 最老简直认了的序列号.SND.NXT = 下一个要发送的序列号.SEG.ACK = 接收TCP简直认,接收TCP期待的下一个序列号.SEG.SEQ = 一个数据段的第一个序列号.SEG.LEN = 数据段中包括的字节数.SEG.SEQ+SEG.LEN1 = 数据段的最后一个序列号.如果一个数据段的序列号小于即是确认号的值,那么整个数据段就被确认了.而在接收数据时下面的比力把持是必需的:RCV.NXT = 期待的序列号和接收窗口的最低沿.RCV.NXT+RCV.WND:1 = 最后一个序列号和接收窗口的最高沿.SEG.SEQ = 接收到的第一个序列号.SEG.SEQ+SEG.LEN:1 = 接收到的最后一个序列号.。
通俗大白话来理解TCP协议的三次握手和四次分手

通俗⼤⽩话来理解TCP协议的三次握⼿和四次分⼿通俗理解:但是为什么⼀定要进⾏三次握⼿来保证连接是双⼯的呢,⼀次不⾏么?两次不⾏么?我们举⼀个现实⽣活中两个⼈进⾏语⾔沟通的例⼦来模拟三次握⼿。
引⽤⽹上的⼀些通俗易懂的例⼦,虽然不太正确,后⾯会指出,但是不妨碍我们理解,⼤体就是这么个理解法。
第⼀次对话:⽼婆让甲出去打酱油,半路碰到⼀个朋友⼄,甲问了⼀句:哥们你吃饭了么?结果⼄带着⽿机听歌呢,根本没听到,没反应。
甲⼼⾥想:跟你说话也没个⾳,不跟你说了,沟通失败。
说明⼄接受不到甲传过来的信息的情况下沟通肯定是失败的。
如果⼄听到了甲说的话,那么第⼀次对话成功,接下来进⾏第⼆次对话。
第⼆次对话:⼄听到了甲说的话,但是他是⽼外,中⽂不好,不知道甲说的啥意思也不知道怎样回答,于是随便回答了⼀句学过的中⽂:我去厕所了。
甲⼀听⽴刻笑喷了,“去厕所吃饭”?道不同不相为谋,离你远点吧,沟通失败。
说明⼄⽆法做出正确应答的情况下沟通失败。
如果⼄听到了甲的话,做出了正确的应答,并且还进⾏了反问:我吃饭了,你呢?那么第⼆次握⼿成功。
通过前两次对话证明了⼄能够听懂甲说的话,并且能做出正确的应答。
接下来进⾏第三次对话。
第三次对话:甲刚和⼄打了个招呼,突然⽼婆喊他,“你个死⿁,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得⼆话不说就跑回家了,把⼄⾃⼰晾那了。
⼄⼼想:这什么⼈啊,得,我也回家吧,沟通失败。
说明甲⽆法做出应答的情况下沟通失败。
如果甲也做出了正确的应答:我也吃了。
那么第三次对话成功,两⼈已经建⽴起了顺畅的沟通渠道,接下来开始持续的聊天。
通过第⼆次和第三次的对话证明了甲能够听懂⼄说的话,并且能做出正确的应答。
可见,两个⼈进⾏有效的语⾔沟通,这三次对话的过程是必须的。
为了保证服务端能收接受到客户端的信息并能做出正确的应答⽽进⾏前两次(第⼀次和第⼆次)握⼿,为了保证客户端能够接收到服务端的信息并能做出正确的应答⽽进⾏后两次(第⼆次和第三次)握⼿。
简述三次握手和四次挥手的流程

一、三次握手的流程1. 客户端向服务器发起连接请求在进行三次握手的第一步,客户端会向服务器发送一个特殊的SYN(同步)包,来请求建立连接。
这个包中会包含一个随机生成的序列号,作为本次连接的起始值。
2. 服务器确认客户端的请求收到客户端的SYN包之后,服务器会向客户端发送一个ACK (确认)包作为应答,并且也会包含一个随机生成的序列号,作为本次连接的起始值。
此时,服务器也会发送一个SYN包给客户端,表示自己也同意连接。
3. 客户端确认服务器的应答客户端收到服务器的ACK包之后,同样会发送一个ACK包作为应答,表示客户端也同意建立连接。
此时,双方的连接就正式建立起来了。
二、四次挥手的流程1. 客户端告知服务器自己要断开连接在进行四次挥手的第一步,客户端会向服务器发送一个FIN(结束)包,表示自己要断开连接。
2. 服务器收到客户端的请求,确认可以断开连接服务器收到客户端的FIN包之后,会向客户端发送一个ACK包作为应答,表示自己已经收到了客户端的断开连接请求,并且同意断开连接。
3. 服务器也告知客户端自己要断开连接在进行四次挥手的第三步,服务器会向客户端发送一个FIN包,表示自己也要断开连接。
4. 客户端确认服务器的应答,断开连接客户端收到服务器的FIN包之后,会向服务器发送一个ACK包作为应答,表示自己已经收到了服务器的断开连接请求,并且同意断开连接。
此时,连接就正式断开了。
总结:三次握手和四次挥手是TCP协议中用于建立和断开连接的过程,通过以上流程的描述,我们可以清晰地了解到建立连接和断开连接的详细步骤。
这对于网络通信的稳定性和安全性有着重要的意义。
在网络通信中,TCP协议的三次握手和四次挥手是非常重要的过程,它们保证了数据的可靠传输和连接的安全关闭。
接下来,我们将对三次握手和四次挥手的过程进行更深入的探讨。
我们来看三次握手的过程。
在这个过程中,客户端和服务器需要经历一系列步骤来建立可靠的连接。
客户端向服务器发送一个特殊的SYN (同步)包,其中包含一个随机生成的序列号,用于标识本次连接的起始值。
TCPIP协议三次握手与四次握手流程解析

TCPIP协议三次握⼿与四次握⼿流程解析⼀、TCP报⽂格式TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。
下⾯是TCP报⽂格式图:图1 TCP报⽂格式上图中有⼏个字段需要重点介绍下:(1)序号:Seq序号,占32位,⽤来标识从TCP源端向⽬的端发送的字节流,发起⽅发送数据时对此进⾏标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收⽅应该尽快将这个报⽂交给应⽤层。
(D)RST:重置连接。
(E)SYN:发起⼀个新连接。
(F)FIN:释放⼀个连接。
RST信息,则是client向server发送数据请求,但是server并没有运⾏.则client会收到来⾃对⽅主机发送的RST信息.11个状态中,除了ESTABLISHED外,还有2个⽐较重要的状态:CLOSED_WAIT和TIME_WAIT.CLOSE_WAIT状态时有对⽅主动调⽤close,向本地(这⾥本地,并不⼀定说的是client)发送FIN,本地接收到FIN,并向对⽅发送ACK之后,本地状态会变成CLOSE_WAIT状态.那么,本地如果需要从CLOSE_WAIT状态变成CLOSED状态,需要本地向对⽅发送FIN,也就是需要本地主动调⽤close,本地进⼊LAST_ACK,在本地接收到ACK之后,就进⼊CLOSED状态.需要注意的是:(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认⽅Ack=发起⽅Req+1,两端配对。
⼆、三次握⼿所谓三次握⼿(Three-Way Handshake)即建⽴TCP连接,就是指建⽴⼀个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建⽴。
三次握手和四次挥手的原理

三次握手和四次挥手的原理三次握手是指在建立TCP连接时,客户端和服务器之间需要进行三次通信确认。
第一次握手:客户端发送一个SYN(同步序列号)包给服务器,请求建立连接。
该包包含随机的初始序列号。
第二次握手:服务器收到客户端的SYN包后,向客户端发送一个SYN+ACK(确认同步序列号)包。
该包中将确认客户端的初始序列号,并在该确认序列号的基础上增加1第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送一个ACK(确认)包。
该包中确认服务器的初始序列号,并在该确认序列号的基础上增加1,建立连接。
原理:1.客户端发送的SYN包使服务器知道客户端的存在,并向客户端发送SYN+ACK包确认对方的存在。
2.客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK,表示接收到了服务器的确认,并建立连接。
3.服务器收到客户端的ACK包后,也确认了客户端的存在,并完成连接的建立。
四次挥手是指在断开TCP连接时,客户端和服务器之间需要进行四次通信确认。
第一次挥手:客户端发送一个FIN(结束)包给服务器,请求断开连接。
第二次挥手:服务器收到客户端的FIN包后,向客户端发送一个ACK 包,表示已经接收到了客户端的请求,并还没有准备好断开连接。
第三次挥手:服务器发送一个FIN包给客户端,表示服务器准备好断开连接。
第四次挥手:客户端收到服务器发送的FIN包后,向服务器发送一个ACK包,表示已经接收到了服务器的请求,并确认断开连接。
原理:1.客户端发送的FIN包表示客户端不再发送数据,但仍然可以接收来自服务器的数据。
2.服务器收到客户端的FIN包后,向客户端发送一个ACK包,表示已经接收到了客户端的断开请求,但服务器可能还有数据需要发送给客户端。
3.服务器完成数据发送后,发送一个FIN包给客户端,表示服务器已经准备好断开连接。
4.客户端收到服务器的FIN包后,向服务器发送一个ACK包,确认接收到了服务器的请求,并断开连接。
三次握手协议四次挥手
三次握手协议四次挥手建立TCP需要三次握手才能建立,而断开连接则需要四次握手。
整个过程如下图所示:先来看看如何建立连接的。
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。
Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
那如何断开连接呢?简单的过程如下:【注意】中断连接端可以是Client端,也可以是Server端。
假设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连接就这样关闭了!整个过程Client端所经历的状态如下:而Server端所经历的过程如下:【注意】在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。
tcp三次握手与四次挥手
TCP三次握手四次挥手症结字: tcp三次握手四次挥手1.TCP握手协定(简略清楚明了)在TCP/IP协定中,TCP协定供给靠得住的衔接办事,采取三次握手树立一个衔接.第一次握手:树立衔接时,客户端发送syn包(syn=j)到办事器,并进入SYN_SEND状况,等待办事器确认;第二次握手:办事器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK 包,此时办事器进入SYN_RECV状况;第三次握手:客户端收到办事器的SYN+ACK包,向办事器发送确认包ACK(ack=k+1),此包发送完毕,客户端和办事器进入ESTABLISHED状况,完成三次握手.完成三次握手,客户端与办事器开端传送数据,在上述进程中,还有一些主要的概念:未衔接队列:在三次握手协定中,办事器保护一个未衔接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目标明办事器已收到 SYN包,并向客户发出确认,正在等待客户的确认包.这些条目所标识的衔接在办事器处于Syn_RECV状况,当办事器收到客户的确认包时,删除该条目,办事器进入ESTABLISHED状况. Backlog参数:暗示未衔接队列的最大容纳数量.SYNACK 重传次数办事器发送完SYN-ACK包,假如未收到客户确认包,办事器进行初次重传,等待一段时光仍未收到客户确认包,进行第二次重传,假如重传次数超出体系划定的最大重传次数,体系将该衔接信息从半衔接队列中删除.留意,每次重传等待的时光不必定雷同.半衔接存活时光:是指半衔接队列的条目存活的最长时光,也即办事从收到SYN包到确认这个报文无效的最长时光,该时光值是所有重传要求包的最长等待时光总和.有时我们也称半衔接存活时光为Timeout时光.SYN_RECV存活时光.2.TCP握手协定(具体)TCP/IP 是许多的不合的协定构成,现实上是一个协定组,TCP用户数据报表协定(也称作TCP传输掌握协定,Transport Control Protocol.靠得住的主机到主机层协定.这里要先强调一下,传输掌握协定是OSI收集的第四层的叫法,TCP传输掌握协定是TCP/IP 传输的6个根本协定的一种.两个TCP意思非雷同. ).TCP是一种靠得住的面向衔接的传送办事.它在传送数据时是分段进行的,主机交流数据必须树立一个会话.它用比特流畅信,即数据被作为无构造的字撙节.经由过程每个TCP传输的字段指定次序号,以获得靠得住性.是在OSI参考模子中的第四层,TCP是运用IP的网间互联功效而供给靠得住的数据传输,IP不断的把报文放到收集上,而TCP是负责确信报文到达.在协同IP的操纵中TCP负责:握手进程.报文治理.流量掌握.错误检测和处理(掌握),可以依据必定的编号次序对非正常次序的报文赐与从新分列次序.关于TCP的RFC文档有RFC793.RFC791.RFC1700.在TCP会话初期,有所谓的“三握手”:对每次发送的数据量是如何跟踪进行协商使数据段的发送和吸收同步,依据所吸收到的数据量而肯定的数据确认数及数据发送.吸收完毕后何时裁撤接洽,并树立虚衔接.为了供给靠得住的传送,TCP在发送新的数据之前,以特定的次序将数据包的序号,并须要这些包传送给目标机之后的确认新闻. TCP老是用来发送大批量的数据.当运用程序在收到数据后要做出确认时也要用到TCP.因为TCP须要时刻跟踪,这须要额外开销,使得TCP的格局有些显得庞杂.下面就让我们看一个TCP的经典案例,这是后来被称为MITNICK进击中KEVIN首创了两种进击技巧:TCP会话劫持SYN FLOOD(同步大水)在这里我们评论辩论的时TCP会话劫持的问题.先让我们明确TCP树立衔接的根本简略的进程.为了扶植一个小型的模拟情形我们假设有3台接入互联网的机械.A为进击者把持的进击机.B为中介跳板机械(受信赖的办事器).C为受害者运用的机械(多是办事器),这里把C机械锁定为目标机械.A机械向B机械发送SYN包,要求树立衔接,这时已经响应要求的B机械会向A机械回应SYN/ACK标明赞成树立衔接,当A机械接收到B机械发送的SYN/ACK回应时,发送应答ACK树立A机械与B机械的收集衔接.如许一个两台机械之间的TCP通话信道就树立成功了.B终端受信赖的办事器向C机械提议TCP衔接,A机械对办事器提议SYN信息,使C机械不克不及响应B机械.在同时A机械也向B机械发送虚伪的C机械回应的SYN数据包,吸收到SYN数据包的B 机械(被C机械信赖)开端发送应答衔接树立的 SYN/ACK数据包,这时C机械正在忙于响应以前发送的SYN数据而无暇回应B机械,而A机械的进击者猜测出B机械包的序列号(如今的TCP序列号猜测难度有所加大)冒充C机械向B机械发送应答ACK这时进击者骗取B 机械的信赖,冒充C机械与B机械树立起TCP协定的对话衔接.这个时刻的C机械照样在响应进击者A机械发送的SYN数据.TCP协定栈的弱点:TCP衔接的资本消费,个中包含:数据包信息.前提状况.序列号等.经由过程有意不完成树立衔接所须要的三次握手进程,造成衔接一方的资本耗尽.经由过程进击者有意的不完成树立衔接所须要的三次握手的全进程,从而造成了C机械的资本耗尽.序列号的可猜测性,目标主机应答衔接要求时返回的SYN/ACK的序列号时可猜测的.(早期TCP协定栈,具体的可以拜见1981年出的关于TCP雏形的RFC793文档)TCP头构造TCP协定头起码20个字节,包含以下的区域(因为翻译不由雷同,文章中给出响应的英文单词):TCP源端口(Source Port):16位的源端口个中包含初始化通讯的端口.源端口和源IP地址的感化是标示报问的返回地址.TCP目标端口(Destination port):16位的目标端口域界说传输的目标.这个端口指明报文吸收盘算机上的运用程序地址接口.TCP序列号(序列码,Sequence Number):32位的序列号由吸收端盘算机运用,从新分段的报文成最初情势.当SYN消失,序列码现实上是初始序列码(ISN),而第一个数据字节是ISN+1.这个序列号(序列码)是可以抵偿传输中的不一致.TCP应答号(Acknowledgment Number):32位的序列号由吸收端盘算机运用,重组分段的报文成最初情势.,假如设置了ACK掌握位,这个值暗示一个预备吸收的包的序列码.数据偏移量(HLEN):4位包含TCP头大小,指导何处数据开端.保存(Reserved):6位值域,这些位必须是0.为了未来界说新的用处所保存.标记(Code Bits):6位标记域.暗示为:紧迫标记.有意义的应答标记.推.重置衔接标记.同步序列号标记.完成发送数据标记.按照次序分列是:URG.ACK.PSH.RST.SYN.FIN.窗口(Window):16位,用来暗示想收到的每个TCP数据段的大小.校验位(Checksum):16位TCP头.源机械基于数据内容盘算一个数值,收信息机要与源机械数值成果完整一样,从而证实数据的有用性.优先指针(紧迫,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标记设置了时才有用.假如URG标记没有被设置,紧迫域作为填充.加速处理标示为紧迫的数据段.选项(Option):长度不定,但长度必须以字节.假如没有选项就暗示这个一字节的域等于0.填充:不定长,填充的内容必须为0,它是为了数学目标而消失.目标是确保空间的可猜测性.包管包头的联合和数据的开端处偏移量可以或许被32整除,一般额外的零以包管TCP头是32位的整数倍. 标记掌握功效URG:紧迫标记紧迫(The urgent pointer) 标记有用.紧迫标记置位,ACK:确认标记确认编号(Acknowledgement Number)栏有用.大多半情形下该标记位是置位的.TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提醒远端体系已经成功吸收所稀有据.PSH:推标记该标记置位时,吸收端不将该数据进行队列处理,而是尽可能快将数据转由运用处理.在处理 telnet 或 rlogin 等交互模式的衔接时,该标记老是置位的.RST:复位标记复位标记有用.用于复位响应的TCP衔接.SYN:同步标记同步序列编号(Synchronize Sequence Numbers)栏有用.该标记仅在三次握手树立TCP衔接时有用.它提醒TCP衔接的办事端检讨序列编号,该序列编号为TCP衔接初始端(一般是客户端)的初始序列编号.在这里,可以把TCP序列编号看作是一个规模从0到4,294,967,295的32位计数器.经由过程TCP衔接交流的数据中每一个字节都经由序列编号.在TCP报头中的序列编号栏包含了TCP分段中第一个字节的序列编号.FIN:停止标记带有该标记置位的数据包用来停止一个TCP回话,但对应端口仍处于凋谢状况,预备吸收后续数据.办事端处于监听状况,客户端用于树立衔接要求的数据包(IP packet)按照TCP/IP协定客栈组合成为TCP处理的分段(segment).剖析报头信息: TCP层吸收到响应的TCP和IP报头,将这些信息存储到内存中.检讨TCP校验和(checksum):尺度的校验和位于分段之中(Figure:2).假如磨练掉败,不返回确认,该分段丢弃,并等待客户端进行重传.查找协定掌握块(PCB{}):TCP查找与该衔接相接洽关系的协定掌握块.假如没有找到,TCP将该分段丢弃并返回RST.(这就是TCP处理没有端口监听情形下的机制) 假如该协定掌握块消失,但状况为封闭,办事端不挪用connect()或listen().该分段丢弃,但不返回RST.客户端会测验测验从新树立衔接要求.树立新的socket:当处于监听状况的socket收到该分段时,会树立一个子socket,同时还有socket{},tcpcb{}和 pub{}树立.这时假如有错误产生,会经由过程标记位来裁撤响应的socket和释放内存,TCP衔接掉败.假如缓存队列处于填满状况,TCP以为有错误产生,所有的后续衔接要求会被谢绝.这里可以看出SYNFlood进击是若何起感化的.丢弃:假如该分段中的标记为RST或ACK,或者没有SYN标记,则该分段丢弃.并释放响应的内存.发送序列变量SND.UNA :发送未确认SND.NXT :发送下一个SND.WND :发送窗口SND.UP :发送优先指针SND.WL1 :用于最后窗口更新的段序列号SND.WL2 :用于最后窗口更新的段确认号ISS :初始发送序列号吸收序列号RCV.NXT :吸收下一个RCV.WND :吸收下一个RCV.UP :吸收优先指针IRS :初始吸收序列号当前段变量SEG.SEQ :段序列号SEG.ACK :段确认标识表记标帜SEG.LEN :段长SEG.WND :段窗口SEG.UP :段紧迫指针SEG.PRC :段优先级CLOSED暗示没有衔接,各个状况的意义如下:LISTEN :监听来自远方TCP端口的衔接要求.SYNSENT :在发送衔接要求后等待匹配的衔接要求. SYNRECEIVED :在收到和发送一个衔接要求后等待对衔接要求的确认.ESTABLISHED :代表一个打开的衔接,数据可以传送给用户.FINWAIT1 :等待长途TCP的衔接中止要求,或先前的衔接中止要求的确认.FINWAIT2 :从长途TCP等待衔接中止要求.CLOSEWAIT :等待从当地用户发来的衔接中止要求. CLOSING :等待长途TCP对衔接中止的确认.LASTACK :等待本来发向长途TCP的衔接中止要求的确认.TIMEWAIT :等待足够的时光以确保长途TCP吸收到衔接中止要求的确认.CLOSED :没有任何衔接状况.TCP衔接进程是状况的转换,促使产生状况转换的是用户挪用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS.传送过来的数据段,特殊那些包含以下标识表记标帜的数据段SYN,ACK,RST和FIN.还有超时,上面所说的都邑时TCP状况产生变更.序列号请留意,我们在TCP衔接中发送的字节都有一个序列号.因为编了号,所以可以确认它们的收到.对序列号的确认是累积性的.TCP必须进行的序列号比较操纵种类包含以下几种:①决议一些发送了的但未确认的序列号.②决议所有的序列号都已经收到了.③决议下一个段中应当包含的序列号.对于发送的数据TCP要吸收确认,确认时必须进行的:SND.UNA = 最老的确认了的序列号.SND.NXT = 下一个要发送的序列号.SEG.ACK = 吸收TCP的确认,吸收TCP等待的下一个序列号.SEG.SEQ = 一个数据段的第一个序列号.SEG.LEN = 数据段中包含的字节数.SEG.SEQ+SEG.LEN1 = 数据段的最后一个序列号.假如一个数据段的序列号小于等于确认号的值,那么全部数据段就被确认了.而在吸收数据时下面的比较操纵是必须的:RCV.NXT = 等待的序列号和吸收窗口的最低沿.RCV.NXT+RCV.WND:1 = 最后一个序列号和吸收窗口的最高沿.SEG.SEQ = 吸收到的第一个序列号.SEG.SEQ+SEG.LEN:1 = 吸收到的最后一个序列号.。
tcp三次握手和四次挥手的全过程
tcp三次握⼿和四次挥⼿的全过程1、三次握⼿(1)三次握⼿的详述⾸先Client端发送连接请求报⽂,Server段接受连接后回复ACK报⽂,并为这次连接分配资源。
Client端接收到ACK报⽂后也向Server段发⽣ACK报⽂,并分配资源,这样TCP连接就建⽴了。
最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,⽽B被动打开连接。
(A、B关闭状态CLOSED——B收听状态LISTEN ——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建⽴状态ESTABLISHED)B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。
然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。
若有,则作出响应。
1)第⼀次握⼿:A的TCP客户进程也是⾸先创建传输控制块TCB,然后向B发出连接请求报⽂段,(⾸部的同步位SYN=1,初始序号seq=x),(SYN=1的报⽂段不能携带数据)但要消耗掉⼀个序号,此时TCP客户进程进⼊SYN-SENT(同步已发送)状态。
2)第⼆次握⼿:B收到连接请求报⽂段后,如同意建⽴连接,则向A发送确认,在确认报⽂段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),测试TCP服务器进程进⼊SYN-RCVD(同步收到)状态;3)第三次握⼿:TCP客户进程收到B的确认后,要向B给出确认报⽂段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第⼆个报⽂段所以要+1),ACK报⽂段可以携带数据,不携带数据则不消耗序号。
TCP连接已经建⽴,A进⼊ESTABLISHED(已建⽴连接)。
当B收到A的确认后,也进⼊ESTABLISHED状态。
(2)总结三次握⼿过程:第⼀次握⼿:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产⽣⼀个值seq=x,并将该数据包发送给Server,Client进⼊SYN-SENT状态,等待Server确认;第⼆次握⼿:Server收到数据包后由标志位SYN=1得知Client请求建⽴连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产⽣⼀个值seq=y,并将该数据包发送给Client以确认连接请求,Server进⼊SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;第三次握⼿:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建⽴成功,Client和Server进⼊ESTABLISHED状态,完成三次握⼿,随后Client和Server就可以开始传输数据。
TCP三次握手
TCP三次握手/四次挥手详解[转]一、Linux服务器上11种网络连接状态:图:TCP的状态机通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手注:以下说明最好能结合”图:TCP的状态机”来理解。
SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。
表示一个新的TCP连接请求。
ACK: (确认编号,Acknowledgem ent Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求*/2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求*/3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV /* A connection request has been received from the network. 在收到和发送一个连他套接字。
尤其是试图使用该端口创建新的Socket实例时,将抛出IOException异常。
TCP三次握手/四次挥手详解1、建立连接协议(三次握手)(1)客户端发送一个带SY N标志的TCP报文到服务器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TCP三次握手/四次挥手详解
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机)
ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A 的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包
ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据.
实例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836 IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
图解:
一个三次握手的过程(图1,图2)
(图1)
(图2)
第一次握手的标志位(图3)
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
(图3)
第二次握手的标志位(图4)
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
(图4)
第三次握手的标志位(图5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
(图5)
一个完整的三次握手也就是请求---应答---再次确认
四次分手:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。
收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。
和SYN
一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
状态详解:
CLOSED:这个没什么好说的了,表示初始状态。
LISTEN:这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET 处于监听状态,可以接受连接了。
SYN_RCVD:这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。
因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT:这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT 连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。
SYN_SENT状态表示客户端已发送SYN 报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1:这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。
而这两种状态的区别是:
FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。
而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL 后即可回到CLOSED可用状态了。
如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING:这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。
正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。
但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN 报文。
什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN 报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。
怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK 报文给对方,此时则进入到CLOSE_WAIT状态。
接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。
所以你在CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK:这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN 报文后,最后等待对方的ACK报文。
当收到ACK报文后,也即可以进入到CLOSED 可用状态了。
总结:
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN (ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的.
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。