计算机网络(一)网络场景
网络分层模型
OSI模型和TCP/IP模型
OSI模型
- 物理层
负责传输比特流,定义物理介质的传输方式、电气特性等(集线器)
- 数据链路层
负责通过物理连接传输数据帧,提供数据的可靠传输和错误检测(网桥、交换机)
网络层与数据链路层都是基于目标地址将数据发送给接收端的,但是网络层负责将整个数据,而数据链路层则只负责发送一个分段内的数据。
- 网络层
数据包的路由和转发(路由器,网络层协议包括IP, 互联网控制消息协议(ICMP))
- 传输层
提供端到端的数据传输服务,确保数据的可靠传输和流量控制(TCP、UDP)
- 会话层
建立、管理和终止会话连接,处理应用程序之间的通信(会话恢复、会话同步)
- 表示层
处理数据的表示和转换,确保不同系统的数据格式能够互相理解(数据加密,数据压缩)
- 应用层
为用户提供应用程序和网络服务的接口,实现特定应用程序之间的通信(HTTP、FTP、SMTP)
总结:
OSI参考模型共有7层,从上到下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
应用层的协议有HTTP、HTTPS,传输层的协议有TCP和UDP,网络层的协议有IP、ICMP、ARP协议
为什么分层
我认为网络分层的好处是,对各个层之间进行了解耦,层一层之间不会产生关联性,比如我们应用层的HTTP协议,从HTTP1.1升级到HTTP2.0的时候,并不会对传输层、网络层等有影响,或者网络层的IPV4协议升级为IPv6协议的时候,也不会影响应用层、传输层。
不过,OSI参考模型只是理论模型,实际上因特网中的网络模型是使用了TCP/IP网络模型,它对OSI参考模型做了简化,把应用层、表示层、会话层统一成了应用层,数据链路层和物理层统一成了网络接口层。
TCP/IP模型
- 网络接口层:
- 功能:负责将数据包发送到物理网络上,处理硬件设备和驱动程序之间的通信。
- 示例设备:网卡、网桥。
- 网络层:
- 功能:负责数据包的路由和转发,实现不同网络之间的通信。网络层的核心协议是IP、ARP、ICMP等协议。IP协议负责寻址和路由,ARP协议负责获取MAC地址,ICMP负责提供诊断功能并报告错误。
- 协议:IP、ARP、ICMP
- 传输层:
- 功能:提供端到端的数据传输服务,确保数据的可靠传输和流量控制。
- 示例协议:TCP、UDP。
- 应用层:
- 功能:为用户提供应用程序和网络服务的接口,实现特定应用程序之间的通信。
- 示例协议:HTTP、FTP、SMTP
包、帧、数据报、段、消息
IP数据报
TCP数据段
网络层以上数据都可以叫包
数据链路传输的是帧
应用协议的数据单位是消息
键入网址场景
输入网址后,期间发生了什么
关键输入网址后涉及的每一个网络协议的工作原理和作用:
HTTP/HTTPS协议->DNS协议->TCP协议->IP协议->ARP协议
- 浏览器会先解析URL,解析出域名、资源路径、端口等信息,然后构造HTTP请求报文。
- 接着进行域名解析,将域名解析为IP地址,会先查系统缓存是否域名信息,如果有就返回IP地址,没有就会查看本地系统host文件有没有域名信息,如果有就返回IP地址,如果没有就去查本地DNS服务器,如果本地DNS服务器缓存中有域名信息,就返回IP地址,否则本地DNS服务器分别去根域名服务器->顶级域名服务器->权威域名服务器询问,最后拿着返回的IP交给浏览器。
- 由于HTTP是基于TCP传输的,所以在发送HTTP请求前,需要进行三次握手,在客户端发送第一次握手的时候,TCP头部会填上SYN标记位,同时填上目标端口和源端口的信息。源端口是浏览器随机生成的,目标端口要看是HTTP还是HTTPS,如果是HTTP默认目标端口是80,如果是HTPS默认是443。
- 然后到网络层,会加上IP头,同时填上目标IP地址和源IP地址。
- 然后到数据链路层,会通过ARP协议,获取路由器的MAC地址,然后会加上MAC头,填上目标MAC地址和源MAC地址。
- 然后到物理层之后,直接把数据包,转发给路由器,路由器再通过下一跳,最终找到目标服务器,然后目标服务器收到客户的SYN报文后,会响应第二次握手。当双方都完成三次握手后,如果是HTTP协议,客户端就会将HTTP请求就会发送给目标服务器;如果是 HTPS协议,客户端还要和服务端进行TLS四次握手之后,客户端才会将HTTP报文发送给目标服务器。
- 目标服务器收到HTTP请求消息后,就返回HTTP响应消息,浏览器会对响应消息进行解祈渲染,呈现给用户。
DNS是如何解析的?属于哪一层的协议
DNS属于应用层的协议,客户端在进行DNS解析之前,会先查看浏览器和操作系统是否有缓存域名对应的IP地址,如果没有就会向本地DNS服务器发出查询请求;
接着本地DNS向根DNS发送查询请求,根DNS服务器收到请求后会返回顶级域名服务器的IP地址;
然后本地DNS服务器再向顶级域名服务器发出查询请求,顶级DNS服务器收到请求后会返回权威域名服务器的IP地址;
然后本地DNS服务器再向权威域名服务器发出查询请求,权威域名服务器收到请求后,就会返回域名对应的IP地址了,最后本地DNS服务器返回查询结果给客户端,同时本地域名服务器把返回的结果保存到缓存,以备下一次使用。
DNS域名解析使用的什么协议
在DNS中,域名解析请求和响应都是基于UDP进行传输的。
UDP是一种无连接的传输层协议,它提供了一种简单的传输机制,适用于对实时性要求较高的应用场景。DNS使用UDP协议进行域名解析是因为域名解析通常是短小而频繁的请求,UDP的无连接特性可以减少建立和断开连接的开销,并提高解析的效率。
UDP对于TCP的缺点是没办法保证数据的可靠传输,针对这个缺陷,可以在应用层实现一个超时重传机制,如果域名解析请求在一定时间内没收到响应,那么就重发域名解析请求。
网络传输场景
如果浏览器没有显示页面有哪些原因
最直接的办法就是抓包,排查的思路大概有:
先确定是服务端的问题,还是客户端的问题。
- 先在客户端确认浏览器是否可以访问其他网站,如果不可以,说明客户端网络自身的问题,然后检查客户端 网络配置(连接wifi正不正常,有没有插网线);
- 如果可以正常其他网页,说明客户端网络是可以正常上网的。
- 如果客户端网络没问题,就抓包确认DNS是否解析出了IP地址,如果没有解析出来,说明域名写错了,如果解析出了IP地址,抓包确认有没有和服务端建立三次握手:
- 如果没有成功建立三次握手,需要在服务端通过ps确认server进程是否启动了,以及通过netstat命令确认是否监听了端口。
- 如果能成功建立三次握手,并且发出了HTTP请求,但是就是没有显示页面,可以查看服务端返回的响应码:
- 如果是404错误码,检查输入的url是否正确;
- 如果是500,说明服务器此时有问题,这时候就需要去服务器排查日志了;
- 如果是200,可以在浏览器按F12输出前端控制台,看看前端代码有问题导致浏览器没有渲染出页面。
- 如果客户端网络是正常的,但是访问速度很慢,导致很久才显示出来。可以通过ping去确认网络延迟是否正常,如果耗时很严重,可以排查服务器的流量是不是很大,导致超过了带宽上限,产生了丢包的问题。如果网络是正常的,可能要排查接口为什么处理这么久,这里有可能是慢Sql导致的。
客户端TCP连接一个不存在的IP地址的服务端会发生什么
如果访问的IP地址是局域网内的,客户端的内核在发arp请求的时候,广播询问这个目标IP地址是谁的,由于网络中不存在该目标IP地址,所以没有设备应答客户端的arp请求,这时候就会卡在arp协议,客户端的SYN报文是发送不出去的。
如果访问的IP地址不是局域网的,客户端会先将SYN报文发给路由器,然后路由器会继续转发,由于目标IP地址是不存在的,该SYN报文会在网络中消亡,因此客户端是不会收到对SYN报文的确认报文的,接着客户端会触发超时重传,重传SYN报文,直到重传的次数达到最大次数后,客户端的连接就会被释放。
客户端TCP连接一个IP地址存在但是端口不存在的服务端会发生什么
端口不存在的话,代表服务端没有监听这个端口,服务端在收到客户端的SYN报文后,服务端会回RST报文,客户端收到RST报文后,会断开连接。
RST(Reset)报文是TCP(传输控制协议)中的一种重要控制报文,用于终止TCP连接或响应异常情况。
客户端UDP发送一个IP地址存在但是端口不存在报文会发生什么
服务端会回ICMP报文,报告端口不可达
ICMP(Internet ControlMessage Protocol)报文是一种网络协议,用于在IP网络中传输控制消息和错误信息。