TCP头部: 其中 ACK SYN 序号 这三个部分在如下会用到,它们的介绍也在下面。
服务器
暂时须要的信息有:ide
ACK : TCP协议规定,只有ACK=1时有效,也规定链接创建后全部发送的报文的ACK必须为1spa
SYN(SYNchronization) : 在链接创建时用来同步序号。当SYN=1而ACK=0时,代表这是一个链接请求报文。对方若赞成创建链接,则应在响应报文中使SYN=1和ACK=1. 所以, SYN置1就表示这是一个链接请求或链接接受报文。资源
FIN (finis)即完,终结的意思, 用来释放一个链接。当 FIN = 1 时,代表此报文段的发送方的数据已经发送完毕,并要求释放链接。
同步
三次握手的过程:it
首先由Client发出请求链接即 SYN=1 ACK=0 (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,所以声明本身的序号是 seq=xio
而后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1,class
再而后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.请求
而后链接创建,为何要进行三次握手呢(两次确认)。程序
下面是释放链接的过程:
当客户A 没有东西要发送时就要释放 A 这边的链接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的链接已经关闭,即A再也不发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放链接, B数据发送完成后就向A请求链接释放,也是用FIN=1 表示, 而且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。
为何要等待呢?
为了这种状况: B向A发送 FIN = 1 的释放链接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在 WAIT_TIME 还可以接收到这个请求,这时再回复一个确认就好了。(A收到 FIN = 1 的请求后 WAIT_TIME会从新记时)
另外服务器B存在一个保活状态,即若是A忽然故障死机了,那B那边的链接资源何时能释放呢? 就是保活时间到了后,B会发送探测信息, 以决定是否释放链接。