TCP/IP的三次握手和四次挥手
TCP/IP,通常放在一起,但是TCP和IP是两个不同的协议。
IP协议是用来查找地址的,对应着网际互联层,TCP协议是用来规范传输规则的,对应着传输层。
IP只负责找到地址,具体传输的工作交给TCP来完成。就像快递的送递一样,填写的规则和内容相当于IP协议,最后打电话,送货物,客户签收 相当于TCP协议。
三次握手
报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
SYN: 同步位,用于建立连接时同步序号,发起连接。作用就是当接收端收到SYN = 1,的报文会直接将ACK设置为接收到的seq+1的值
seql: sequence number, 表示所传数据的序号。
ACK:确认位,用于建立连接时同步序号。正常通信时ACK = 1,第一次等于0
ack: acknoledgement number: 表示确认号。接收端用它来给发送端反馈已经成功接收到的数据,它的值为希望接收的下一个数据包起始序号。它的值表示前面数据已经成功接收到了。
FIN: 终止位,用来数据传输完毕后释放连接。
第一次握手: 客户端发送一个SYN标志 = 1,以及初始序号X;Client进入SYN_SENT状态,等待Server确认。
第二次握手:服务端发送ACK确认。SYN = 1, ACK = 1同时,将确认序号设置为刚才第一次从客户端收到的序号X+1,即ACK = X+1;Server进入SYN_RCVD状态;
第三次握手:客户端再次发送ACK确认。再将确认序号设置为ACK = Y+1, 同时发送数据。这时,客户端和服务端开始对话,传输数据。
四次挥手
第一次挥手: Server收到FIN后,用来关闭CIient到Server的数据传送,但并未关闭Server到CIient和Client到Server的数据传送(因为Server收到FIN报文,不会立即关闭连接,需要选回复一个ACK告诉Client我收到你的关闭请求了,但是等我先把数据传送完,之后再发送FIN报文); Client进入FIN_WAIT_1状态;
第二次挥手: 在ACK=1下,Server发送ack等于收到的报文序号+1,ack=u+1传送给Client数据为seq=v;同时处于CLOSE_WAIT状态
第三次挥手: Server发送给Client一个FIN=1,关闭Server到Client的连接;Server处于LAST_ACK
第四次挥手: CIient收到FIN后处于TIME_WAIT状态,并没有立即关闭Cilent到Server的连接,还是可以发送数据,发送一个确认序号ACK+1,Server就Close了。然后Client在TIME_WAIT状态下等待2MSL(最大生存时间)关闭Client连接,此状态用于重新发送可能丢失的ACK报文。至此,TCP的四次挥手结束,连接关闭
在三次握手中为什么Client最后还要发送一次确认呢?
这主要是因为防止已失效的连接请求报文段(意思就是Client发出的请求因为请求报文段丢失而未收到确认,Client就进行了重传,后来连接后关闭了连接,然后又收到了连接报文)突然又传送到了服务端server。
在四次挥手中为什么Cilent要等待2MSL时间后再关闭呢
主要有两个原因。
1。为了保证Client最后发送到Server的确认报文段能够到达Server,因为这个ACK很有可能丢失,一旦丢失,服务端就回超时重传FIN+ACK报文段,Client收到后就会再次进行重传确认,然后再次启动2MSL计时器。
2。防止已经是失效的连接请求报文段出现。2MSL可以保证所有的延迟的失效的请求报文段都消失,释放。