声明
概念:网络分层
- 简述OSI七层协议
OSI七层协议包括:物理层,数据链路层,网络层,运(传)输层,会话层,表示层,应用层
- 简述TCP/IP五层协议
TCP/IP五层协议包括:物理层(联想网线光纤),数据链路层(交换机),网络层(路由器),运(传)输层(进程),应用层(协议)
- 物理层有什么作用?
主要解决两台物理机之间的通信,通过二进制比特流的传输来实现,二进制数据表现为电流电压上的强弱,到达目的地再转化为二进制机器码。网卡、集线器工作在这一层。
- 数据链路层有什么作用?
在不可靠的物理介质上提供可靠的传输,接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路。提供物理地址寻址功能。交换机工作在这一层。
- 网络层有什么作用?
将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方,通过路由选择算法为分组通过通信子网选择最佳路径。路由器工作在这一层。
- 运(传)输层有什么作用?
传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
-
会话层有什么作用?
建立会话:身份验证,权限鉴定等;
保持会话:对该会话进行维护,在会话维持期间两者可以随时使用这条会话传输局;
断开会话:当应用程序或应用层规定的超时时间到期后,OSI会话层才会释放这条会话。 -
表示层有什么作用?
对数据格式进行编译,对收到或发出的数据根据应用层的特征进行处理,如处理为文字、图片、音频、视频、文档等,还可以对压缩文件进行解压缩、对加密文件进行解密等。
- 应用层有什么作用?
提供应用层协议,如HTTP协议,FTP协议等等,方便应用程序之间进行通信。
TCP/UDP
- TCP与UDP区别?
TCP作为面向流的协议,提供可靠的、面向连接的运输服务,并且提供点对点通信
UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播,传输速率快,发出去就算成功。
- 为何TCP可靠?
TCP有三次握手建立连接,四次挥手关闭连接的机制。除此之外还有滑动窗口和拥塞控制算法。最最关键的是还保留超时重传的机制。对于每份报文也存在校验,保证每份报文可靠性。
- 为何UDP不可靠?
UDP面向数据报无连接的,数据报发出去,就不保留数据备份了,仅仅在IP数据报头部加入校验和复用。
UDP没有服务器和客户端的概念。UDP报文过长的话是交给IP切成小段,如果某段报废报文就废了。
- 简述TCP粘包现象?
TCP是面向流协议,发送的单位是字节流,因此会有多个小尺寸数据封装在一个tcp报文中发出去的可能性。
可以简单的理解成客户端调用了两次send,服务器端一个recv就把信息都读出来了。
- TCP粘包现象处理方法?
固定发送信息长度,或在两个信息之间加入分隔符。
- 简述TCP协议的滑动窗口?
滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,防止发送方发送速度过快而导致自己被淹没。
- 简述TCP协议的拥塞控制?
拥塞是指一个或者多个交换点的数据报超载,TCP又会有重传机制,导致过载。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量:
当cwnd < ssthresh 时,使用慢开始算法。
当cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh 时,即可使用慢开始算法,也可使用拥塞避免算法。
慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。
拥塞避免:cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。
快恢复之前的策略:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免。
快恢复:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,并把cwnd设置为ssthresh的一半,之后进行拥塞避免。
- 简述快重传?
如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。
- 简述TCP三次握手过程?
-
第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端
进入syn_sent状态,等待服务端确认。 -
第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。
-
第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输数据了。
故事版(切勿当真):
你和老板说: 我要打十个(向服务端发送连接请求,等待服务器响应)
老板回复: 我准备好了打十个人的医药费 (回复客户端的连接请求,等待客户端响应确认收到了服务端的响应)
你和老板说:好,那我就去打十个去了(客户响应服务端回复确认消息给服务端)。
打人中(数据传输)…
关键字说明:
SYN:Synchronize Sequence Numbers,同步序列编号
ACK:Acknowledge Character,确认字符
SEQ:Sequence Number,序列号
- 为什么TCP握手需要三次?两次行不行?四次、五次行不行?
三次握手的原因是避免重复连接,TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值。
两次握手不行:如果只是两次握手,至多只有客户端的起始序列号能被确认, 服务器端的序列号则得不到确认。此时如果因为网络环境等客户端的其它起始序列号也到达服务端,服务端无法确认这个连接就是已经确认收到客户端的连接,只能一直处于接收状态造成网络混乱。
四次、五次可以: 但是3次就可以做,可以但没必要,耗时耗力。
- 简述半连接队列? 什么叫做TCP的半连接?
TCP握手中,当服务器处于SYN_RCVD 状态,服务器会把此种状态下请求连接放在一个队列里,该队列称为半连接队列。
- 简述SYN攻击?
SYN攻击即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。
优化方式:
- 缩短SYN Timeout时间
- 记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。
- 简述TCP四次挥手过程?
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。
- 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
- 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。
- 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。
- 为什么TCP挥手需要4次?
主要原因是当服务端收到客户端的 FIN 数据包后,服务端可能还有数据没发完,不会立即close。所以服务端会先将 ACK 发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将 FIN 包发给客户端表示现在可以断了。之后客户端需要收到 FIN包后发送 ACK 确认断开信息给服务端。
- 为什么四次挥手释放连接时需要等待2MSL?
MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。
DNS
- 简述DNS协议?
DNS协议是基于UDP的应用层协议,它的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。
- 简述DNS解析过程?
1、客户机发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给dns服务器
2、本地dns服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里面查找。
3、本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名dns服务器
4、根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址
5、客户机的dns服务器根据返回的信息接着访问下一级的dns服务器
6、这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
7、客户机的本地的dns服务器会将查询结果返回给我们的客户机
8、客户机根据得到的ip信息访问目标主机,完成解析过程
HTTP/HTTPS 协议
- 简述HTTP协议?
http协议是超文本传输协议。它是基于TCP协议的应用层传输协议,即客户端和服务端进行数据传输的一种规则。该协议本身是一种无状态的协议。
- 简述cookie
HTTP 协议本身是无状态的,为了使其能处理更加复杂的逻辑,HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等等。
- 简述session?
session用于标记特定客户端信息,存在在服务器的一个文件里。
一般客户端带Cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息。
- 简述http状态码和对应的信息?
1XX:接收的信息正在处理
2XX:请求正常处理完毕
3XX:重定向
4XX:客户端错误
5XX:服务端错误
常见错误码:
301:永久重定向
302:临时重定向
304:资源没修改,用之前缓存就行
400:客户端请求的报文有错误
403:表示服务器禁止访问资源
404:表示请求的资源在服务器上不存在或未找到
- 转发和重定向的区别?
转发是服务器行为。服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,用户浏览器地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。
重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏url会发生改变,而且不能共享数据。(Nginx可通过重定向的方式将所有的HTTP请求重定向到HTTPS)
- 简述http1.0?
规定了请求头和请求尾,响应头和响应尾(get post)每一个请求都是一个单独的连接,做不到连接的复用
- 简述http1.1的改进?
HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。服务端无法主动push
- 简述HTTP短连接与长连接区别?
HTTP中的长连接短连接指HTTP底层TCP的连接。
短连接: 客户端与服务器进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。
长连接:如果HTTP头部带有参数keep-alive,即开启长连接网页完成打开后,底层用于传输数据的TCP
连接不会直接关闭,会根据服务器设置的保持时间保持连接,保持时间过后连接关闭。
- 简述http2.0的改进?
提出多路复用。多路复用前,文件是串行传输的,请求a文件,b文件只能等待,并且连接数过多。引入多路复用,a文件b文件可以同时传输。引入了二进制数据帧。其中帧对数据进行顺序标识,有了序列id,服务器就可以进行并行传输数据。
- http与https的区别?
http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份。
https具有安全性的ssl加密传输协议,加密采用对称加密,
https协议需要到ca(权威机构)申请证书,一般免费证书很少,需要交费。
扩展: 漫画图解HTTP1.0、HTTP1.1与HTTP2.0多路复用
- 简述TLS/SSL, HTTP, HTTPS的关系?
SSL全称为Secure Sockets Layer即安全套接层,其继任为TLSTransport Layer Security传输层安全协议,均用于在传输层为数据通讯提供安全支持。
可以将HTTPS协议简单理解为HTTP协议+TLS/SSL
- https的连接过程?
- 浏览器将支持的加密算法信息发给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
- 客户端(SSL/TLS)解析证书验证证书合法性,生成对称加密的密钥,我们将该密钥称之为clientkey,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
- 服务器将加密后的密文发送给客户端
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
- Get与Post区别?
Get:一般为从服务器请求资源,Get请求的数据会暴露在URL中(表单提交默认为get方法,如果使用get方法提交表单也会暴露在url中),没有请求体数据大小在1k以内。
Post:向服务器传输资源。传输的数据放在请求体中不会显示在URL中,数据大小没有限制,post在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。
- 简述REST API吗?
REST API全称为表述性状态转移(Representational State Transfer,REST)即利用HTTP中get、post、put、delete以及其他的HTTP方法构成REST中数据资源的增删改查操作:
Create : POST
Read : GET
Update : PUT/PATCH
Delete: DELETE
- 浏览器中输入一个网址后,具体发生了什么?
(简版回答):
- 进行DNS解析操作,根据DNS解析的结果查到服务器IP地址
- 通过ip寻址和arp,找到服务器,并利用三次握手建立TCP连接
- 浏览器生成HTTP报文,发送HTTP请求,等待服务器响应
- 服务器处理请求,并返回给浏览器
- 根据HTTP是否开启长连接,进行TCP的挥手过程
- 浏览器根据收到的静态资源进行页面渲染
- 浏览器中输入一个网址后,从一个请求到响应都发生了什么事?
(原理超详细版本)
- 常规的网络交互过程是从客户端发起网络请求,用户态的应用程序(浏览器)会生成 HTTP 请求报文、并通过 DNS 协议查找到对应的远端 IP 地址。
- 在套接字生成之后进入内核态,浏览器会委托操作系统内核协议栈中的上半部分,也就是 TCP/UDP 协议发起连接请求。
- 然后经由协议栈下半部分的 IP 协议进行封装,使数据包具有远程定位能力。
- 经过 MAC 层处理,找到接收方的目标 MAC 地址。
- 最终数据包在经过网卡转化成电信号经过交换机、路由器发送到服务端,服务端经过处理拿到数据,再通过各种网络协议把数据响应给客户端。
- 客户端拿到数据进行渲染。
- 客户端和服务端之间反复交换数据,客户端的页面数据就会发生变化。
国际标准化组织 ISO 推出了统一的 OSI 参考模型。当前网络主要遵循的 IEEE 802.3 标准,就是基于 OSI 模型提出的,主要定义的是物理层和数据链路层有线物理数据流传输的标准。网络分层可以把大问题分割成小问题。同样,分层也保证了网络的松耦合和相对的灵活,分层拆分后易于各层的实现和维护,也方便了各层的后续扩展。网络分层解决了网络复杂的问题,在网络中传输数据中,我们对不同设备之间的传输数据的格式,需要定义一个数据标准,所以就有了网络协议。网络协议是双方通信的一种约定,以便双方都可以理解对方的信息。
发起请求阶段:我们的电脑或⼿机使⽤的应⽤软件都是在应⽤层实现(应⽤层是⼯作在操作系统中的⽤户态),它是最上层的,也是我们能直接接触到的,所以应⽤层只需要专
注于为⽤户提供应⽤功能,不⽤去关⼼数据是如何传输的。用户在浏览器中输入URL浏览器会根据我们的输入内容,先匹配对应的 URL 以及关键词,给出输入建议,同时校
验 URL 的合法性,并且会在 URL 前后补全 URL。以输入baidu.com 为例,首先浏览器会判断出这是一个合法的 URL,并且会补全为 http://www.baidu.com。其中 http 为协议,baidu.com 为网络地址,每个网络栏的地址都符合通用 URI 的语法。URI 一般语法由五个分层序列组成。接着,浏览器从 URL 中会提取出网络的地址,也叫做主机名(host),一般主机名可以为域名或 IP 地址。对 URL 进行解析之后,浏览器确定了服务器的主机名和请求路径,接下来就是根据这些信息来生成 HTTP 请求消息了。
URI = scheme:[//authority]path[?query][#fragment]
URI = 方案:[//授权]路径[?查询][#片段ID]
URL(统一资源定位符)是URI(统一资源标识符)的子集
网络请求前:查看浏览器缓存浏览器在 HTTP 报文生成完成后,它并不是马上就开始网络请求的。在请求发出之前,浏览器首先会检查保存在本地计算机中的缓存,如果访问过当前的 URL,会先进入缓存中查询是否有要请求的文件。此时存在的缓存有路由器缓存、DNS 缓存、浏览器缓存、Service Worker、Memory Cache、Disk Cache、Push Cache、系统缓存等。如果没有访问过当前的 URL,就会跳过缓存这一步,这时我们就会进入网络操作了。
域名解析(非IP地址访问):DNS在浏览器确认了输入的 URL 之前没有访问,浏览器就会生成对应的 HTTP 请求,这时浏览器需要委托操作系统将 HTTP 报文发送到对应的服务端。在发送消息之前,还有一个工作需要做,就是查找服务端的 IP 地址,因为操作系统在发送消息时,必须知道对方的 IP 地址才可以发送。
域名与DNS的作用:但是由于 IP 地址由一串数字组成,不够语义化,为方便记忆和更贴近人类自然语言,我们将 IP 地址映射为域名,于是就有这样一个服务,维护了 IP 和域名的映射关系,它就是非常重要的基础设施——DNS 服务器。DNS 服务器是一个分布式数据库,分布在世界各地。为提高效率,DNS 是按照一定的结构进行组织的,不同层次之间按照英文句点. 来分割。在域名中,我们的层级关系是按照从左到右、从低到高排列的,不同层级由低到高维护了一个树形结构,最高一级的根节点为 root 节点,就是我们所谓的根域名服务器(在美国),因此 baidu.com 完整的域名应该是 baidu.com. ,后面的 . 相当于.root。但是所有域名的顶级域名都一样,因此被省略;再下一级.com 为顶级域名;再下一级的 baidu 为权威域名。因为这是一个树形结构,所以客户端只要请求到一个 DNS 服务器,就可以一层层递归和迭代查找到所有的 DNS 服务器了。按照由高到低的优先级,DNS 域名解析的过程排列如下。
DNS解析 > 浏览器DNS缓存 > hosts文件 > 本地DNS服务器 > ISP DNS服务器
操作系统协议栈(传输层和网络层): 现在我们已经根据 URL 拿到需要请求的唯一地址了,接下来就要委托操作系统将 HTTP 报文发送出去了,这个过程由操作系统中的协议栈负责处理。TCP/IP 协议栈是现在使用最广泛的网络协议栈,Internet 就是建立在 TCP/IP 协议栈基础上的。
除 TCP/IP 协议栈外,我们的操作系统内核可以支持多个不同的协议栈,如LwIp。
协议栈内部分为几部分,分别承担着不同的作用。协议栈的上半部分负责和应用层通过套接字(Socket)进行交互,它可以是 TCP 协议或 UDP 协议。应用层会委托协议栈的上部分完成收发数据的工作;而协议栈的下半部分则负责把数据发送给到指定方的 IP 协议,由 IP 协议连接下层的网卡驱动。
可靠性传输(建立 TCP 连接):浏览器通过 DNS 解析拿到 baidu 的 IP 地址后, 浏览器取出 URL 的端口(HTTP 默认 80,HTTPS 默认 443)。随即浏览器会委托操作系统协议栈的上半部分创建新的套接字(Socket)向对应的 IP 发起 TCP 连接请求。为了确保通信的可靠性,建立 TCP 首先会先进行三次握手的操作,我们可以结合后面的图示理解。
TCP 的三次握手: 1. 首先浏览器作为客户端会发送一个小的 TCP 分组,这个分组设置了一个特殊的 SYN 标记,用来表示这是一条连接请求。同时设置初始序列号为 x 赋值给 Seq (这次捕获组的数据为: SYN=1, Seq=1)。2. 服务器接受到客户端的 SYN 连接后,会选择服务器初始序号 y。同时向客户端发送含有连接确认(SYN+ACK)、Seq=0(本例中的服务器初始序号)、Ack=1(客户端的序号 x +1)等信息的 TCP 分组。3. 客户端收到了服务器的确定字段后,向服务器发送带有 ACK=1、Seq=1 (x+1)、Ack=1 (服务器 Ack 信息的拷贝)等字段的 TCP 分组给服务器。即使是发送一个 TCP 分组,也是一次网络通信,那么对于 TCP 层来说,这一次通信的数据前面就要包含一个 TCP 包头,向下层表明这是个 TCP 数据包。TCP 包头其实是一个数据结构,下图就是 TCP 的包头,对于 TCP 头部来说,以下几个字段是很重要的,你要格外关注。TCP 层封装好了数据包,会将这个 TCP 数据包向下层发送,而 TCP 层的下层就是 IP 层,下面我们一起去瞧一瞧完成目的地定位的 IP 层。
首先,源端口号(Source port)和目标端口号(Destinantion port)是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。其次,你需要注意的是一串有序数字 Sequence number,这个序号保证了 TCP 报文是有序被接受的,解决网络包的乱序问题。之后的 Acknowledgement number 是确认号,只有对方确认收到,否则会一直重发,这个是防止数据包丢失的。紧接着还有一些状态位,由于 TCP 是有状态的,是用于维护双方连接的状态,状态发生变更会更新双方的连接状态。后面还有一个,窗口大小 Window Size,用于流量控制(滑动窗口)。
网络层(IP):TCP在维护状态的过程中,都需要委托 IP 层将数据封装,发送和处理网络数据包进入网络层。 IP 层处理上层网络数据包的过程,网络数据包(无论输入数据包还是输出数据包)进入网络层后,IP 层协议的函数都要对网络数据包做后面这 5 步操作:
1.数据包校验和检验
2.防火墙对数据包过滤
3.IP选项处理
4.数据分片和重组
5.接收、发送和前送
IP 协议是 TCP/IP 协议栈的核心,IP 协议中规定了在 Internet 上进行通信时应遵循的规则,包括 IP 数据包应如何构成、数据包的路由等,而 IP 层实现了网络上的点对点通信。
为了完成上述操作,IP 层被设计成三个部分,分别是 IP 寻址、路由和分包组包。在网络通信的过程中,每个设备都必须拥有自己的 IP 地址才可以完成通信,我们的 IP 地址是以四组八位的组合进行约定,每组以. 号隔开,再转化为十进制的方式。这里要注意,IP 地址并不是以主机数目进行配置的,而是根据网卡数来进行。有了 IP 地址,就可以通信了,但 IP 层仍然是一个软件实现的功能逻辑层,那它如何完成通信呢,答案是不能直接完成通信,它只是把 IP 地址及相关信息组装成一个 IP 头,把这个 IP 头放在网络数据的前面,形成了 IP 包。
最后把这个 IP 包发送给 IP 层的下一层组件就行了,IP 头的格式如下所示。
数据链路层中的MAC处理:有了 IP 头的网络数据,就有了发送目的地的信息, MAC 层,就是 IP 层的下一层组件进行点对点传输:网络数据在 IP 层中加上 IP 头后,形成了 IP 包,进入 MAC 层,需要对 IP 包加上 MAC 头,这个 MAC 头包括发送方的 MAC 头和接收方的 MAC 头,用于两个物理地址点对点的传输;此外还有一个头部字段为协议类型,在常规的 TCP/IP 协议中,MAC 头的协议类型只有 IP 和 ARP 两种。MAC 头格式如下所示。
MAC(链路层)我们经常听说网卡 MAC 地址,这个 MAC 地址指的就是计算机网卡的物理地址(Physical Address),MAC 地址被固化到网卡中,用来标识一个网络设备。MAC 地址是唯一且无重复的,由国际标准化组织分配,用来确保网络中的每个网卡是唯一的。
发送方的 MAC 头比较容易获取,读取当前设备网卡的 MAC 地址就可以获取,而接收方的 MAC 头则需要通过 ARP 协议在网络中携带 IP 地址,在一个网络中发送广播信息,这样就能获取这个网络中的 IP 地址对应的 MAC 地址,然后就能给我们的 IP 包加上 MAC 头了,最后这个加上 MAC 头的 IP 包,成为一个 MAC 数据包,就可以准备发送出去了。
发送输出(网络层中的最低层——物理层,电信号的出口):网卡(物理层)现在我们拿到了经过层层处理过的数据包,数据包只是一串二进制数据,网络上的数据传送,是依赖电信号的,所以我们现在需要将数据包转化为电信号,才能在物理的网线上面传输。数据包通过网络协议栈的层层处理,最终得到了 MAC 数据包,这个 MAC 数据包会交给网卡驱动程序,网卡驱动程序会将 MAC 数据包写入网卡的缓冲区(网卡上的内存).然后,网卡会在 MAC 数据包的起止位置加入起止帧和校验序列,最后网卡会将加入起止帧和校验序列的 MAC 数据包转化为电信号,发送出去。
客户端服务端的持续数据交换(应用层)现在,数据通过网卡离开了计算机,进入到局域网,通过局域网中的设备,集线器、交换机和路由器等,数据会进入到互联网,最终到达目标服务器。
服务器处理:服务器就会先取下数据包的 MAC 头部,查看是否匹配自己 MAC 地址。然后继续取下数据包的 IP 头,数据包中的目标 IP 地址和自己的 IP 地址匹配,再根据 IP 头中协议项,知道自己上层是 TCP 协议。之后,还要继续取下数据包 TCP 的头。完成一系列的顺序校验和状态变更后,TCP 头部里面还有端口号,此时我们的 HTTP 的 server 正在监听这个端口号,就把数据包再发给对应的 HTTP 进程。HTTP 进程从服务器中拿到对应的资源(HTML 文件),再交给操作系统对数据进行处理。然后再重复上面的过程,层层携带 TCP、IP、MAC 头部。接下来数据从网卡出去,到达客户端,再重复刚才的过程拿到相应数据。客户端拿到对应的 HTML 资源,浏览器就可以开始解析渲染了,这步操作完成后,用户最终就能通过浏览器看到相应的页面。
网络协议各层之间封装与拆封数据的过程,如下所示:
客户端与服务器之间用网络协议连接通信的过程,如下所示:
此时客户端和服务端之间通过 TCP 协议维护了一个连接状态,如果客户端需要关闭网络,那么会进行四次挥手,两边的网络传输过程至此完成。
扩展:
https过程:在建立TCP连接后进行在传输层进行TSL认证加密解密(传输层加上TSL安全套接字协议)
CDN过程:客户端的请求不会直接到服务端,而是先到CSD服务器如果在CDN中命中,直接返回给客户端,如果没有命中回源请求在返回给客户端,用于加速访问。
客户端流程:
服务端流程:
根据底层网络机制的差异,计算机网络世界中定义了不同协议族的套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix 套接字)、CCITT X.25 地址(X.25 套接字)等。
Internet 套接字是 TCP/IP 协议栈中传输层协议的接口,也是传输层以上所有协议的实现。
- 为什么HTTP是无状态的?HTTP协议是无状态的和Connection:keep-alive的区别?
协议的状态是指下一次传输可以“记住”这次传输信息的能力。http为了保证服务器内存等原因是不会为了下一次连接而维护这次连接所传输的信息。
无状态协议:是指协议对干事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开务器上的网页之间没有任何联系。
比如客户打开一个网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。由于Web服务器要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由干Web服务器不保存发送请求的Web浏览器进程的任何信息,因此HTTP协议属于无状态协议(StatelessProtocol)。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用干传输HTTPTCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive(服务器处理完客户的请求后,并收到客户端的应答后,不会立即断开)没能改变这个结果。
随着时间的推移,人们发现静态的HTML着实无聊而乏味,增加动态生成的内容才会令Web应用程序变得更加有用。干是平,HTML法在不断膨胀,其中最重要的是增加了表单(Form);客户端也增加了诸如脚本处理、DOM处理等功能:对于服务器,则相应的出现了CGl (Common GatewayInterface)以处理包含表单提交在内的动态请求。
在客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些交互式应用程序的实现,毕竟交互是需承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookin另一个则是Session。
Cookie是客户端的存储空间,由浏览器来维持。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制平田的早在服务持状态的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制达到保存标识的目的,但实际上还有其他选择,比如说重写URL和隐藏表单域。
简单的说就是cookie和session起到保存客户端状态的作用,但是它们并没有改变http协议本身这种无状态的性质,可以理解为在应用上估态保留。
客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些交互式应用程序的实现,毕竟交互是需承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookin另一个则是Session。
Cookie是客户端的存储空间,由浏览器来维持。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制平田的早在服务持状态的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制达到保存标识的目的,但实际上还有其他选择,比如说重写URL和隐藏表单域。
简单的说就是cookie和session起到保存客户端状态的作用,但是它们并没有改变http协议本身这种无状态的性质,可以理解为在应用上估态保留。