之前写过kcp详细的原理分析,时隔多年。决定把范围扩大点,把整个网络的原理都记录一下原理。

1.网络7层模型

首先先把网络的7层模型贴出来。

1.应用层是由网络应用程序使用的,离用户最近的一层。应用层通过各种协议(FTP——文件传输协议;HTTP/S——网上冲浪协议;SMTP——邮件传输协议;Telnet——与虚拟端之间的通信协议),为网络应用提供服务(网络应用是指使用会互联网的计算机应用),执行用户活动。

2.表示层从应用层接受数据,这些数据是以字符和数字的形式出现的(如:Chinese、666),表示层将这些字符和数据,转换成机器能够理解的二进制格式(1001 0110),表示层的这个功能称为“翻译”功能,即把人类的语言翻译成机器能理解的语言。

3.会话层用于建立和管理连接、启用、发送和连接数据,也就是各种API或应用程序接口,还有NetBIOS,即网络基本输入输出系统,它允许不同计算机上的应用程序相互通信。

4.在会话层之下时传输层。传输层通过分段(Segmentation)、流量控制(Flow Control)和差错控制(Error Control)来控制通信的可靠性。

5.传输层将数据传递到网络层,网络层用于将接收到的数据段从一台计算机传输到不同网络中的另一台计算机,网络层的数据单元称为数据包(Packets),网络层的功能是进行逻辑寻址(Logical Addressing)、路由(Rout)和路径确定(Path Determination)。

6.数据链路层从网络层接收数据包,数据包包含了发送方和接受方的IP地址。有两种寻址方式:逻辑寻址和物理寻址。逻辑寻址在网络层已经完成,即在数据段(Segment)中添加了发送方和接收方的IP地址,以形成IP数据包。

7.物理层到现在为止,应用的“行为动作”已经通过传输层进行了分割,变成网络层的数据包和数据链路层的数据“帧”,现在是一种二进制序列了,最后在物理层将这些二进制序列转换成信号并在本地介质(铜缆、光纤、无线信号等)上传输,并在目标计算机应用层上显示数据。

通过上图可以看到http协议是应用层协议,tcp/udp是传输层协议。像游戏开发中,需要玩家与服务器建立长时间链接使用tcp/udp效率更好一些。简单理解就是http通信需要先建立tcp链接然后发送消息发完了就断了或者是中间有什么错误发生就断链。频繁的创建关闭链接性能会造成浪费。

2.http协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同, 用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端, 而提供资源响应的一端称为服务器端。

HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个 空行,也就是 「CRLF」,十六进制的「0D0A」。

 在这个浏览器发出的请求报文里,第一行 GET / HTTP/1.1 就是请求行,而后面的 Host、Connection 等等都属于 header,报文的最后是一个空白行结束,没有 body。

常见的响应码:

2xx 成功

2xx的响应结果就代表请求被正常处理了

200 OK:表示客户端发来的请求被服务器正常处理了204 Not Content:请求被成功处理,但是返回的响应报文不包含实体的主体部分206 Partial Content:客户端进行范围请求,而服务器重新执行了这部分的GET请求

3xx 重定向

3xx的响应结果就表明浏览器需要执行某些特殊的处理以正确处理请求

301 Moved Permanently:永久重定向。表示请求的资源已经被分配了新的URI,以后应该使用新的URI302 Found:临时重定向。代表资源只是暂时的移动了以后还可能会移动为新的URI303 See Other:由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源304 Not Modified:客户端发送附带条件(请求首部中if开头的属性中的一种)的请求的时候,服务端允许访问资源,但是那些请求并没有满足,直接返回304,即服务端资源未改变,可以直接使用客户端未过期的缓存,304返回时,不包含任何响应的主体部分(虽然被划分为3xx里,但是和重定向没有任何关系)

4xx 客户端错误

4xx的响应结果就表明客户端是发生错误的原因所在

400 Bad Requset:请求报文中存在语法错误,请修改请求内容后再发送请求401 Unauthorized:客户端未认证授权403 Forbidden:服务端禁止客户端访问此资源404 Not Found:URL写错了,找不到此路径

5xx 服务器错误

5xx的响应结果就表明服务器本身发生错误

500 Internal Server Error:服务器内部故障,可能是bug导致的503 Service Unavaliable:服务器暂时不可用(停机维护或者超负载),如果事先知道解除这种情况所需的时间,最好写入响应头中的Retry-After这个字段再返回给客户端

当我们在浏览器输入一个网址并且点击空格的那一下会发生的事情:

1.先把输入的网址换成可找到的ip地址。先看浏览器缓存有没有,没有去hosts文件里找看有没有,如果也没有在去DNS服务器去找。(DNS服务全世界就几台,响应比较耗时)。dns查找中也会加入arp() mac等信息进行查找。

下图实验hosts文件有效性:

上面的ping是没加host的,下面是加后的。看到明显差异

2.对得到的地址服务器进行tcp链接(3次握手)

3.发送http协议

4.服务器在接收到请求报文后,会根据请求报文中的信息进行处理,生成相应的响应报文,并返回给客户端。

5.当浏览器接收到响应报文后,会根据响应头中的 Content-Type 属性确定响应内容的类型,并进行相应的处理。比如,如果是 HTML 类型,浏览器就会解析 HTML 代码,构建 DOM 树,解析 CSS 代码,构建渲染树,并进行布局和绘制,最终展示出页面。

6.当页面全部渲染完成后,浏览器会关闭 TCP 连接,释放资源。

因为http这里面信息如果被攥改,服务器无法得知,这就可能有安全问题,所以后来有个https协议,就是在http基础上加了一层。

加密算法有很多,这里不叙述了。

3.TCP协议

之前kcp有详细说过tcp的滑动窗口啊,重传机制等。这里就贴个基本的协议和握手挥手

4.UDP协议

UDP跟tcp比起来不可靠,tcp的连接发送断开都具备可靠性。udp相反,比如我们看个直播,有时候会画面卡主然后突然过了几秒又跳到了主播的别的画面上去了。原理比较简单,消息扔给对端不检查对方收没收到。但性能比tcp快了很多,没有消息阻塞,慢启动,粘包,握手挥手都慢的问题。很多项目基于udp设计出可靠的协议消息比如kcp。

以下是消息头,明显比tcp还少了不少。

5.WebSocket

说这个之前简单了解下什么是socket:

Socket 是一个应用程序和底层操作系统之间的接口,它允许应用程序通过TCP 和 UDP 协议来发送和接收数据。Socket 主要用于客户端和服务器之间的数据传输。Socket 需要建立连接之后,才能进行数据传输。

通俗一点就是tcp udp的背后一系列复杂的通信过程的事情都是socket帮我们干好了。应用层只需要去直接用就可以了。

WebSocket 是一种网络协议,建立在 HTTP 协议之上,允许双向通信。WebSocket 协议允许服务器发送数据到客户端,同时也可以让客户端向服务器发送数据。WebSocket 使用 HTTP 协议的升级请求和响应来建立连接。WebSocket 的主要优点在于它可以通过单一的TCP连接来实现双向通信,从而减少了连接的开销并提高了数据传输的速度。

简单理解:跟使用tcp长链接原理差不多,浏览器使用这个协议后,服务器就跟其建立链接,数据彼此之前可以随时传递而不是http那种每次请求都得创建新的链接。

具有以下优势:

减少服务器资源的浪费:轮询会导致浏览器不断向服务器发送请求,而WebSocket只需在连接建立时发送一次请求,之后就可以进行双向数据传输,从而节约服务器资源和带宽。

提高实时性:WebSocket支持实时通信,而轮询可能因为服务器数据未更新而发送无效请求。

无同源策略限制:WebSocket通信不受同源策略的限制,允许跨域通信。

参考:

https://blog.51cto.com/u_14954398/2587040

程序员入门必备教程---HTTP协议详解(真的很经典)_哔哩哔哩_bilibili

超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏 - 知乎

WebSocket和Socket有什么区别

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: