天天看点

TCP/IP 协议

TCP/IP 协议

链路层:对0、1进行分组、定义数据帧、确认主机的地理位置进行传输

网络层:定义ip地址,确认主机所在的网络位置,通过ip进行Mac寻址,对外网数据包进行路由转发

传输层:定义端口,确认本机上应用程序的身份并将数据包又给对应的应用程序。

应用层:定义数据格式,并按照对应的的格式解读数据

TCP/IP协议的传输打包图解,反之则是解包

TCP/IP 协议

三次握手机制,是建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息,在socket编程中,客户端执行connect()时。将触发三次握手。

TCP/IP 协议

这边做一下解释:

1、第一次握手时,客户端发送一个TCP/IP的SYN标志位置1的包指明客户端打算连接的服务器的端口,以及初始化序号X,保存在包头的序列号Seq字段里。

2、第二次握手:

服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号ACK设置位客户的ISN加1,即图中的X+1。

3、第三次握手:

客户端再次发送确认包(ACK) SYN标志位为0 ACK标志位为1,并且把服务器发来的ACK的序号字段+1,放在确定字段中发送给对方,并且在数据段放写INS的+1。

TCP四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

图解:

TCP/IP 协议

主动放发出信号即触发了挥手机制。

解释:

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

这边常出现的面试题:

一、为什么连接的时候时三次握手,关闭的时候却是四次挥手?

解答:因为Server端受到的Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文使用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端受到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,通知Client端FIN报文Server端已经接收到了。但是Server端也并不能立即关闭连接,需要等待Server端的所有报文都发送完成后,Server才能发送FIN报文,因此SYN与ACK在Server端不能一并发送,所以需要四次挥手。