对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层,网络接口层。
应用层是不用去关心数据是如何传输的,只需要专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
传输层的作用在于为运行在不同主机上的应用进程之间提供逻辑通信(这里的逻辑通信指的是在传输层角度看来两个进程间直接进行通信,实际上还是通过下层提供的服务)。传输层有两个传输协议,分别是 TCP 和 UDP:
应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段。
我们不希望传输层处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能交给网络层。
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
网络层将数据从一个设备传输到另一个设备,需要依赖IP地址和子网掩码进行寻址找到对应的子网,再去寻找对应的主机。
除了寻址能力, IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。
负责将数据转换为数字信号在物理设备之间传输。在生成了 IP 头部之后,接下来要交给网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
四个层的封装格式如下图:
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
HTTP 是在互联网中约束两设备之间传输超文本数据的约定和规范。
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx
类状态码表示服务器成功处理了客户端的请求,常见的有:
「204 No Content」也是常见的成功状态码,但响应头没有 body 数据。
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向,常见的有:
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Found」即临时重定向,请求的资源还在,但暂时需要用另一个 URL 来访问。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理。常见的有:
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在,所以无法提供给客户端。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,常见的有:
「500 Internal Server Error」与 400 类似,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
对于一些具有重复性的 HTTP 请求,可以把这些「请求-响应」的数据都缓存在本地,提高访问速度,降低服务器压力。
http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,其设置了过期时间大小。当浏览器再次请求访问服务器中的该资源时,会先根据Cache-Control 中设置的过期时间,来判断该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器。
强制缓存:只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,无需向服务器发送请求。
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
对称加密:只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
非对称加密:用公钥和私钥,公钥可任意分发,私钥保密,解决了密钥交换问题但速度慢。
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
HTTP/1.1 和 HTTP/2 都有队头阻塞的问题:
所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
通过session和cookie机制协同保存用户的状态。Session的作用就是通过服务端记录用户的状态,当用户进行操作时,服务端给该用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。最后通过在 Cookie 中附加一个 Session ID 来方式来跟踪这个Session。
使用 Session 维护用户登录状态的过程如下:
如果cookie被禁用的话,可以利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。其本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
ping命令用来测试网络中主机之间的连通性和网络延迟。
工作原理:
基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。
PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题,属于应用层协议,使用UDP传输。
先以递归的方式查询本地 DNS 服务器,再以迭代的方式查询其余服务器。
DNS解析过程:
HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 基于 UDP 的 QUIC 协议 。主要是为了解决 HTTP/2 中存在的队头阻塞问题。
这是由于 HTTP/2.0 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。
使用TCP的协议:
SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
使用UDP的协议:
建立一个 TCP 连接需要“三次握手”,缺一不可:
三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
断开一个 TCP 连接则需要“四次挥手”,缺一不可:
举个例子:A 和 B 打电话,通话即将结束后。
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
由于 TCP 传输协议是面向字节流的传输协议,没有消息保护边界,所以发送方发送的多个数据包,接收方应用层不知如何区分,可能会被当成一个包来处理,这就是粘包;或者,发送方将一个打包分成多个小包发送,而接收方将它们当成多个包进行处理,这就是拆包。
解决方法:
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。
IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
MAC地址:MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。
MAC 地址具有可携带性、永久性,永久地标识一个设备的身份,不论它到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。