1 网络分层结构
计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较 多的是五层模型。
五层模型:应用层、传输层、网络层、数据链路层、物理层
- 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。
- 传输层:负责向两台主机进程之间的通信提供数据传输服务。传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
- 网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。
- 数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
- 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。
2 三次握手
2.1 三次握手流程
假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED 。
- 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向 服务端发送的字段中包含标志位SYN=1 ,序列号seq=x 。第一次握手前客户端的状态为CLOSE , 第一次握手后客户端的状态为SYN-SENT 。此时服务端的状态为LISTEN 。
- 第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号y,然后给 客户端回复一段报文,其中包括标志位SYN=1 , ACK=1 ,序列号seq=y ,确认号ack=x+1 。第二 次握手前服务端的状态为LISTEN ,第二次握手后服务端的状态为SYN-RCVD ,此时客户端的状态 为SYN-SENT 。(其中SYN=1 表示要和客户端建立一个连接, ACK=1 表示确认序号有效)
- 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位ACK=1 , 序列号seq=x+1 ,确认号ack=y+1 。第三次握手前客户端的状态为SYN-SENT ,第三次握手后客户 端和服务端的状态都为ESTABLISHED 。此时连接建立完成。
2.2 两次握手可以吗?
第三次握手主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。
- 比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。
- 连接成功,等待数据传输完毕后,就释放了连接。
- 然后A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段。
- 如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且不发送数据,则B一直等待A发送数据,浪费资源。
3 四次挥手
3.1 四次挥手流程
- A的应用进程先向其TCP发出连接释放报文段( FIN=1,seq=u ),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1 (终止等待1)状态,等待B的确认。
- B收到连接释放报文段后即发出确认报文段( ACK=1,ack=u+1,seq=v ),B进入CLOSEWAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- A收到B的确认后,进入FIN-WAIT-2 (终止等待2)状态,等待B发出的连接释放报文段。
- B发送完数据,就会发出连接释放报文段( FIN=1,ACK=1,seq=w,ack=u+1 ),B进入LASTACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,对此发出确认报文段( ACK=1,seq=u+1,ack=w+1 ),A进入TIMEWAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL (最大报文段生存时间)后,A才进入CLOSED 状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
3.2 第四次挥手为什么要等待2MSL?
- 保证A发送的最后一个ACK报文段能够到达B。这个ACK 报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL 时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED 状态,若A在TIME-WAIT 状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED 状态。
- 防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK 报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。