长沙外贸网站,亚马逊中国官网网站,中国建筑人才信息网,国外无版权素材网站一、TCP的状态
在TCP层#xff0c;有个FLAGS字段#xff0c;这个字段有以下几个标识#xff1a;SYN, FIN, ACK, PSH, RST, URG。
其中#xff0c;对于我们日常的分析有用的就是前面的五个字段。
它们的含义是#xff1a;
SYN 表示建立连接#xff0c;FIN 表示关闭连接…一、TCP的状态
在TCP层有个FLAGS字段这个字段有以下几个标识SYN, FIN, ACK, PSH, RST, URG。
其中对于我们日常的分析有用的就是前面的五个字段。
它们的含义是
SYN 表示建立连接FIN 表示关闭连接ACK 表示响应PSH 表示有 DATA数据传输RST 表示连接重置。
其中ACK是可能与SYNFIN等同时使用的比如SYN和ACK可能同时为1它表示的就是建立连接之后的响应如果只是单个的一个SYN它表示的只是建立连接TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的因为前者表示的是建立连接而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况表示的是连接重置。
一般地当出现FIN包或RST包时我们便认为客户端与服务器端断开了连接而当出现SYN和SYNACK包时我们认为客户端与服务器建立了一个连接。PSH为1的情况一般只出现在 DATA内容不为0的包中也就是说PSH为1表示的是有真正的TCP数据包内容被传递。
TCP的连接建立和连接关闭都是通过请求响应的模式完成的。 二、TCP三次握手
TCP(Transmission Control Protocol)传输控制协议是主机对主机层的传输控制协议提供可靠的连接服务采用三次握手确认建立一个连接。
位码即tcp标志位有6种标示 SYN(synchronous 建立联机)、 ACK(acknowledgement 确认)、 PSH(push 传送)、 FIN(finish 结束)、 RST(reset 重置)、 URG(urgent 紧急)、 Sequence number(顺序号码)、 Acknowledge number(确认号码)。 第一次握手主机A发送位码为syn1随机产生seq number1234567的数据包到服务器主机B由SYN1知道A要求建立联机
第二次握手主机B收到请求后要确认联机信息向A发送ack number(主机A的seq1)syn1ack1随机产生seq7654321的包
第三次握手主机A收到后检查ack number是否正确即第一次发送的seq number1以及位码ack是否为1若正确主机A会再发送ack number(主机B的seq1)ack1主机B收到后确认seq值与ack1则连接建立成功。
完成三次握手主机A与主机B开始传送数据。 在TCP/IP协议中TCP协议提供可靠的连接服务采用三次握手建立一个连接。
第一次握手建立连接时客户端发送syn包(synj)到服务器并进入SYN_SEND状态等待服务器确认
第二次握手服务器收到syn包必须确认客户的SYNackj1同时自己也发送一个SYN包synk即SYNACK包此时服务器进入SYN_RECV状态
第三次握手客户端收到服务器的SYNACK包向服务器发送确认包ACK(ackk1)此包发送完毕客户端和服务器进入ESTABLISHED状态完成三次握手。 三、四次挥手
所谓四次挥手Four-Way Wavehand即终止TCP连接就是指断开一个TCP连接时需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中这一过程由客户端或服务端任一方执行close来触发整个流程如下图所示 由于TCP连接时全双工的因此每个方向都必须要单独进行关闭这一原则是当一方完成数据发送任务后发送一个FIN来终止这一方向的连接收到一个FIN只是意味着这一方向上没有数据流动了即不会再收到数据了但是在这个TCP连接上仍然能够发送数据直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭而另一方则执行被动关闭上图描述的即是如此。
第一次挥手Client发送一个FIN用来关闭Client到Server的数据传送Client进入FIN_WAIT_1状态。
第二次挥手Server收到FIN后发送一个ACK给Client确认序号为收到序号1与SYN相同一个FIN占用一个序号Server进入CLOSE_WAIT状态。
第三次挥手Server发送一个FIN用来关闭Server到Client的数据传送Server进入LAST_ACK状态。
第四次挥手Client收到FIN后Client进入TIME_WAIT状态接着发送一个ACK给Server确认序号为收到序号1Server进入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而不是ACKServer就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失但是却导致TCP协议不符合可靠连接的要求。所以Client不是直接进入CLOSED而是要保持TIME_WAIT当再次收到FIN的时候能够保证对方收到ACK最后正确的关闭连接。
再说第二点
如果Client直接CLOSED然后又再向Server发起一个新连接我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题但是还是有特殊情况出现假设新连接和已经关闭的老连接端口号是一样的如果前一次连接的某些数据仍然滞留在网络中这些延迟数据在建立新连接之后才到达Server由于新连接和老连接的端口号是一样的又因为TCP协议判断不同连接的依据是socket pair于是TCP协议就认为那个延迟的数据是属于新连接的这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL这样可以保证本次连接的所有数据都从网络中消失。