一、网络分层
网络分层是将网络节点所要完成的数据发送或转发、打包和拆包、以及控制信息加载或拆除等工作。
分别由不同的硬件和软件来完成。这样可以将通信和网络互联这一复杂问题变得较为简单。
网络分层的每一层都是为了完成一种功能而设的,为了实现这些功能,就需要遵守共同规则,这个规则叫做协议。
为了它更好的理解,这里介绍5层模型 (应用层->传输层->网络层->数据链路层->物理层)。
1、物理层
该层负责比特流在节点的传输,及负责物理传输,该层协议既与链路有关,也与传输介质有关、其通俗来讲就是把计算机连接起来的物理手段。
2.数据链路层
该层控制网络与物理层之间的通信,其主要功能是如何不可靠的物理线路上进行数据可靠的传输。为了保证传输,从网络层介绍到的数据被分割成特定的可物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接受方的物理地址以及纠错和控制信息。启动地址确定了帧将发送到何处,而纠错和控制信息则保证帧无差错到达。如果再传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
3.网络层
该层决定如何将数据从发送方路由到接受方。网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A到另一个网络节点B的最佳路径
4.传输层
该层为两台主机上的应用程序提供端到端的通信,相比之下,网络层的功能是建立主机到主机的通信。传输层有两个传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,UDP是不可靠的或者说无连接的协议。
5.应用层
应用程序收到传输层的数据后,接下来就要进行解读。解读必须事先规定好格式,而应用层就是规定应用程序的数据格式的。它的主要协议有HTTP、FTP(文件传输协议)、SMTP(简单邮件传输协议)POP3(邮局协议版本3)等。
二、TCP的三次握手与四次挥手
通常采用HTTP连接网络的时候会进行TCP的三次握手,然后传输数据,之后再释放连接。
打开链接 -> 写请求数据 -> 读相应数据 -> 关闭链接
-
第一次握手:建立链接。客户端(Client)发送链接请求报文端,将SYN设置为1、Sequence Number(序列号)为x;接下来客户端进入SYN_SENT状态,等待服务端(Service)的确认。
-
第二次握手:服务端收到客户端的SYN报文段,对SYN报文进行确认,设置Acknowledgment Number(确认号)ACK为 x+1(seq+1);同时自己还要发送SYN请求消息,将SYN设置1,将seq设置为y。服务端将上述所有信息放 到SYN+ACK报文中一并发送给客户端,此事服务端进入SYN_RCVD状态。
-
第三次握手:客户端收到服务器SYN_ACK报文段;将ACK设置为y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(TCP链接成功)状态,完成TCP三次握手
在客户端和服务端通过三次握手建立TCP链接以后,当数据传输完毕,断开链接时就需要进行TCP的四次挥手。
-
第一次挥手:客户端设置seq和ACK,向服务端发送一个FIN报文段。此时,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给客户端了。
-
第二次挥手:服务端收到了客户端发送的FIN报文段,向客户端回了一个ACK报文段。
-
第三次挥手:服务端向客户端发送FIN报文段,请求关闭链接,同时服务端进入一个LAST_ACK状态。
-
第四次挥手:客户端收到服务端发送的FIN报文段,向服务端发送ACK报文段,然后客户端进入TIME_WAIT状态。服务端收到客户端ACK报文以后,就关闭链接。此时,客户端等待2MSL(最大报文段生存时间)后依然没有收到回复,则说明服务端已正常关闭,这样客户端也可以关闭链接了。
如果有大量的链接,每次重复连接和关闭,都要经历三次握手和四次挥手这很显然会造成性能低下。因此HTTP有一种机制叫做Keepalive connections ,它可以再传输协议后仍然保持链接,当客户端需要再次获取连接时,直接使用刚刚空闲下来的连接而无须再次挥手