分层模型

网络模型

OSI七层模型

1. 物理层(Physical Layer)

2. 数据链路层(Data Link Layer)

3. 网络层(Network Layer)

4. 传输层(Transport Layer)

5. 会话层(Session Layer)

6. 表示层(Presentation Layer)

7. 应用层(Application Layer)

TCP/IP四层模型

1. 网络接口层(Network Interface Layer)

2. 网络层(Internet Layer)

3. 传输层(Transport Layer)

4. 应用层(Application Layer)

TCP/IP协议栈的工作原理

  • 当发送端的应用程序要发送数据时,数据首先从应用层开始,自上而下依次经过传输层、网络层、数据链路层和物理层。在每一层,数据都会被添加相应的头部信息,这些头部信息包含了该层协议所需的控制信息,如源端口号、目标端口号、源 IP 地址、目标 IP 地址等。

  • 经过各层的处理后,数据最终以比特流的形式通过物理介质发送到网络上。

  • 接收端则按照相反的顺序,从物理层开始,自下而上依次经过各层。每一层在接收到数据后,会根据头部信息进行相应的处理,去除本层添加的头部信息,并将剩余的数据传递给上一层,直到数据到达应用层,被应用程序接收和处理。

协议

协议的概念

协议,即网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定(通信双方需要遵守的规则)。

比如A、B之间传输文件,指定一套规则:假设规则要求第一次传文件名、第二次传文件大小、第三次传文件内容,之后就按照这个步骤进行传输。

每层的常用协议

应用层

应用层协议主要为用户的应用程序提供网络服务,不同协议满足不同的应用场景需求。


传输层

传输层协议主要负责提供端到端的数据传输服务,根据应用需求提供可靠或不可靠的传输。


网络层

网络层协议主要负责数据包的路由和转发,实现不同网络之间的通信。


数据链路层

数据链路层协议主要负责将网络层传来的数据包封装成帧,并在物理链路上进行传输。


物理层协议主要规定了物理介质的电气、机械、功能和规程特性,以确保数据能够在物理介质上正确传输。

TCP协议

特点

TCP协议是属于传输层的协议,其特点:面向连接、可靠、流式协议、全双工。

三次握手

TCP建立连接的过程叫做握手,握手需要在客户端和服务器之间交换三个TCP报文段。三次握手的目的是为了建立可靠连接。

第一次握手:客户端给服务器发送一个同步报文段SYN,并指定客户端的初始序列号ISN,客户端进入SYN_SENT状态。

SYN标志位被置为1(SYN只是一个比特位,0表示不是SYN,1表示是SYN),同时客户端会随机选择一个初始序列号seq = x。SYN = 1的报文段不能携带任何的数据,但要指定序列号。

第二次握手:服务器接收到来自客户端的同步报文段SYN后,会以自己的SYN报文作为应答,并且也指定了自己的初始序列号ISN。同时会把客户端的 seq+1 确认序列号ack的值,表示自己已经收到了客户端的同步报文段SYN,此时服务器处于SYN_RCVD的状态。确认报文段中SYN = 1,ACK = 1(ACK也只是一个比特位,0表示不是ACK,1表示是 ACK),确认序列号ack = x+1,初始序列号seq = y。

第三次握手:客户端收到来自服务器的同步报文段SYN之后,会发送一个确认报文段ACK,以服务器的seq+1作为ack的值 ,表明自己已经收到来自服务器的同步报文段SYN。客户端进入ESTABLISHED状态,服务器确认报文段ACK之后,也会进入ESTABLISHED状态。确认报文段中,ACK = 1,确认序列号ack = n+1,序列号 seq = m+1。

双方已经建立起连接,可以正常的发送数据。

三次握手

Note

如果是两次握手就建立连接,会有什么问题?

假如主机A第一次发送SYN包因为某些原因在中间某个网络节点产生了滞留,为了建立连接一定会再次发送SYN包,假设这次主机B正确接收,建立起连接。后续这个被阻塞的包被传到主机B,则又可能建立一次连接。这种行为会浪费网络资源和主机的系统资源,包括内存、端口等。同时,可能会导致数据传输混乱,因为两个连接可能会同时传输数据,接收方难以正确区分和处理这些数据,从而影响通信的正常进行。

而三次握手的过程是为了保证连接的可靠性和唯一性。

四次挥手

TCP的连接释放:由客户端到服务器需要一个FIN和ACK,再由服务器到客户端需要一个FIN和ACK,因此通常被称为四次挥手。在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。

第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。也就是客户端发出连接释放报文段(FIN报文),指定序列号seq = u,主动关闭TCP连接,等待服务器的确认。

第二次挥手:服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = u + 1。接着服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。

第三次挥手:服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认。服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。

第四次挥手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。之后客户端进入TIME_WAIT(时间等待)状态,并在此状态下等待 2 倍的 MSL(Maximum Segment Lifetime,最长报文段寿命)时间。服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。

(经过 2MSL 时间后,旧连接的所有报文段都将在网络中消失,这样就可以避免新连接受到旧连接残留报文段的干扰,保证新连接的正常运行。MSL 是一个数据包在网络中生存的最长时间,RFC 793 中建议 MSL 为 2 分钟,但实际应用中,可能会根据不同的操作系统和网络环境进行调整。)

四次挥手

Tip

TCP协议中6个重要的控制标志位及其含义。

标记含义
URGUrgent: 紧急位,URG=1,表示紧急数据
ACKAcknowledgement: 确认位,ACK=1,确认号才生效
PSHPush: 推送位,PSH=1,尽快地把数据交付给应用层
RSTReset: 重置位,RST=1,重新建立连接
SYNSynchronization: 同步位,SYN=1 表示连接请求报文
FINFinish: 终止位,FIN=1 表示释放连接

状态迁移图

状态迁移图

连接建立前的状态

服务器端状态

客户端状态

连接建立后的状态

连接关闭过程中的状态