TCP三次握手:
假设A是客户端,B是服务器。
SYN是什么?
SYN是TCP的一个报文段,TCP规定:SYN报文段为,SYN = 1,且不能携带数据,但是要消耗掉一个seq序列号。
1. A主动打开连接,向B发送SYN = 1, seq = x。
这里的SYN:SYN报文段为,SYN = 1,且不能携带数据,但是要消耗掉一个seq序列号。
2. B接收到请求报文后,如果同意建立连接,就向A发送确认报文:
ACK = 1, SYN= 1,确认号ack = x + 1,
SYN这个报文段也不能携带数据,所以要消耗一个自己的序列号:seq = y
3. A收到B的确认后,还要向B给出确认。
ACK = 1,确认号ack = y + 1,现在自己的序列号为seq = x + 1
ACK报文段可以携带数据,但如果不携带数据则不消耗序号,下一个数据报文段的序号仍是seq = x + 1
第三次握手的意义:
防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
假定不采用三次握手,那么只要B发出确认,新的连接就建立了。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。
TCP四次挥手
1. A先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。
FIN = 1,seq = u(它等于前面已传送过的数据的最后一个字节的序号加1)
TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
A进入终止等待状态1
2. B收到连接释放报文段后,发出确认
ACK = 1, seq = v(等于B前面已传送过的数据的最后一个字节的序号加1),ack = u + 1
B处于半关闭状态,从B到A这个方向的连接并未关闭,B还可以向A发送数据,A还是要接收
3. A收到来自B的确认后,A进入终止等待状态2,等待B发出的连接释放报文段。
4. B没有数据要发送了,进程就通知TCP可以释放连接了,发送释放报文段:
FIN = 1,seq = w(在半关闭状态B可能又发送了一些数据,不发送则为:seq = v + 1),确认号ack = u + 1
B 进入最后确认状态
5. A收到B的释放报文段后,进行确认。
ACK = 1,seq = u + 1, 确认号 ack = w + 1
A进入时间等待状态,时间是:2MSL,然后A进入close状态
6. B收到ACK报文段后,进入close状态
为什么A在TIME-WAIT状态必须等待2MSL的时间呢?
第一,为了保证A发送的最后一个ACK报文段能够到达B。因为A发送的ACK报文段有可能会丢失,那么B会超时重新发送FIN报文段,如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN + ACK报文段,因而也不会再发送一次确认报文段。B就无法正常进入close状态
第二,防止上一节提到的“已失效的连接请求报文段”出现在本连接中。