计算机网络

261 阅读6分钟

为了更好的使网络应用更为普及,规范来控制网络,ISO(国际标准化组织)组织在1985年推出了 OSI(Open System Interconnect)即开放式系统互联 的网络互连模型。

OSI七层模型 TCP/IP 五层模型

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。

目前更为常见的是TCP/IP五层模型, 也就是将会话层和表示层合并到应用层。

每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。

重点记录学习关于TCP 协议相关内容,其它分享只做简要说明,形成完整通信闭环即可,不作深究。

应用层(Application Layer)

应用层是最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP,DNS,RPC等。

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。 HTTP 协议包括哪些请求?

  • GET:请求读取由URL所标志的信息。
  • POST:给服务器添加信息(如注释)。
  • PUT:在给定的URL下存储一个文档。
  • DELETE:删除给定的URL所标志的资源。

传输控制层(Transport Layer)

TCP 协议 TCP(Transmission Control Protocol) 传输控制协议,它是主机端对主机端的传输控制协议,为上层提供可靠的连接服务(或者说是一种面向链接的可靠的协议)。

TCP 数据报结构

20200319132644853.png

  • 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。

  • 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。

  • 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:

URG(Urgent pointer 紧急指针)有效

ACK (Acknowledgement 确认)

PSH (Push 传送) 接收方应该尽快将这个报文交给应用层。

RST (Reset 重置连接)

SYN (Synchronous 建立联机)

FIN (Finish 断开连接)

三次握手

TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

① Client 端发送连接请求报文

② Server 段接受连接后回复 ACK 报文,并为这次连接分配资源。

③ Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。

2020031913392621.png

TCP 四次挥手

建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。 如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。

过程如下(以客户端发起结束请求为例,实际双方都可以发起断开链接请求)

① Client 端发送断开连接请求 FIN 报文

② Server 段接收断开连接后回复 ACK 报文

③ Server 段发送断开连接请求 FIN 报文

④ Client 端接收到断开连接请求并回复 ACK 报文。

注意 服务端收到客户ACK 报文后即断开,但客户端并没有立即断开,而是进入等待状态,稍后再断开。

20200319135917416-2.png

A&Q

  1. 为什么连接是三次握手,而断开需要四次挥手?
  • 建立链接时,当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN报 文是用来同步的。

  • 建议链接时,对 Client 和 Server 双方必须保证都能发送报文并收到对方回应,才算链路可靠。

  • 关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。等到 Server 端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。

  1. 为什么断开链接的时候客户端设置的定时器时间等待要2MSL(两个通信报文的最大时间)?
  • 当 Client 向 Server 端发送断开确认的ACK 报文时,并不确定发出的的指令是否能准确的一次性被服务器接收。

  • 如果服务器没有接收到(这已经耗费了一个报文的最大通信时间了),服务器端将会重新发起一个结束通话的指令(FIN)到客户端,客户端又接收到了服务器发来的结束通信指令将继续给服务器进行一个确认。

TCP/UDP对比

TCP

  1. 可靠,稳定,在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

  2. 效率低,占用系统资源高,易被攻击,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP

  1. 快,安全, UDP是一个无状态的传输协议,所以它在传递数据时非常快.

  2. 不可靠,不稳定,因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

网络层(Network Layer)

核心协议 IP 协议, IP = 网络号 + 主机号

网络层通过 IP 路由寻址来建立两个节点之间的连接。具体是要找到下一跳的 IP 地址后,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。

链路层(Data Link Laye)

在这一层中需要通过 ARP 协议获取相应的硬件 Mac 地址,保持通信目标 IP 不变,更换为下个链路点的 Mac 地址。

其中地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个T协议。