网络相关-面试高频
网络
当前的应用系统主要分两大类,一类是C/S(Client/Server)客户端/服务器架构的,一类是B/S(Browser/Server)浏览器/服务器架构的[3],例如:PC上安装的QQ程序是典型的C/S架构中的客户端程序;通过在浏览器中输入淘宝的网址打开淘宝的主页,就是典型的B/S架构。 无论是哪一种,都需要和远端的服务器进行网络通信和数据交互,同时,服务器之间也需要进行通信,一旦通过网络进行通信,就会不可避免地出现各种网络问题或网络故障,比如DNS服务器、路由器、交换机、集线器等,可能是多个原因引起的,需要逐步地进行排查。
网络问题主要有两大类,一类是客户端与服务器无法建立连接的问题(网络不通、客户端使用了错误的地址或者端口、服务器没有开启监听端口、中间的网络设备故障了、中间的网络设备启动了部分安全规则将数据包拦截等),一类是建立连接后有网络延时或严重丢包问题。对于网络不稳定的场景,尽量使用网线连接路由器;对于网络设备拦截数据包的场景,查看安全规则。要排查网络通信过程中遇到的一系列网络问题,需要掌握一些基础的网络知识,了解一些常用的网络命令,必要时要使用wireshark进行抓包分析
OSI七层模型和TCP/IP四层模型
OSI七层模型的全称为开放式系统互联通信参考模型(Open System Interconnection Reference Model)
TCP/IP的全称为传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol),它是一组用于实现网络互连的通信协议。也有人将物理数据层拆开变成五层结构,一般我们使用的是四层。
应用层:直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。;使用UDP的应用层协议:DNS/DHCP
运输层:报文段/用户数据报。负责向两台主机中进程之间的通信提供通用的数据传输服务;
网络层:数据报,负责为分组交换网上的不同主机提供提供连接和路径选择;
数据链路层:帧,对比特流的功能的加强,提供错误检测和纠正,以确保数据的可靠传输。
物理层:传输比特流,定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
从wireshark中抓到的数据包中能看到每一层的数据信息,如下所示:
数据进入TCP/IP协议的封装过程
最上面的应用层的数据,进入TCP/IP协议栈时的封装过程如下:经过传输层时,会加上TCP头部;经过网络层时,会加上IP头;经过数据链路层时,会加上以太网头。对于数据接收端,会按照相反的方向,将各层的头部剥离掉,最终到上层的数据就是发送端应用层的数据。
协议与端口
此处讲的端口是TCP或UDP通信中数字端口号,要进行TCP或UDP通信时,除了要有IP,必须要有端口。操作系统会有很多默认端口,是留给指定的协议使用的
UDP:NFS:远程文件服务器。RIP:路由信息协议。DHCP:动态主机配置协议。IGMP:网际组管理协议。
对于TCP,需要先绑定目标端口(调用bind),再开启对目标端口的监听(调用listen),准备接收客户端的请求。 对于UDP,是无连接的,只需要绑定端口,不需要开启对端口的监听。有时即使程序开启了端口,可能也连接不上,可能是路由器或者防火墙禁用了该端口,导致发给该端口的数据(包括连接请求)都被拦截了,此时需要在网络环境中放行该端口,即不再拦截与该端口相关的数据。
如何判断远端服务器的端口有没有开启监听,有个简单的方法,只要使用Telnet命令去测试即可,比如telnet 192.168.102.176 7800。如果远端的7800端口没有开启监听,就是显示连接失败。如果cmd窗口中提示找不到Telnet,需要到控制面板->程序与功能->启用和关闭Windows功能中开启Telnet客户端,
TCP的三次握手与四次挥手
- TCP头的构成
- 源端口和目标端口:源端口是该包数据发送者的端口,目标端口是这包数据要发送到的目的端口。
- (包)序号:当前数据包的包序号Seq序号,占4字节(32bit),用来标识从TCP源端向目的端已经发送了多少字节的数据,发起方发送数据时对此进行标记。包序号的最大值是65535,如果达到最大值,则会从0开始重新计数。
- 确认号:Ack序号,占4字节(32bit),只有ACK标志位为1时,该确认序号字段才有效。在TCP中,接收端收到发送端发来的数据后会给客户端回一个ACK确认包,确认收到数据了,这就是TCP的ACK机制。
- URG紧急:当 URG = 1 时,表明此报文段中有紧急数据,是高优先级的数据,应尽快发送,不用在缓存中排队。
ACK确认:仅当 ACK = 1 时确认号字段才有效,当 ACK = 0 时确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置为 1。
PSH推送:接收方收到 PSH = 1 的报文段时,就直接发送给应用进程,而不用等到整个缓冲区都填满了后再向上传送。
RST复位:当 RST = 1 时,表明 TCP 连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
SYN同步:SYN = 1 表示这是一个连接请求或连接接受报文。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 且 ACK = 1。
FIN终止:用来释放一个连接。当 FIN = 1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。
- 三次握手
- 客户端SYN = 1 连接请求
- 服务器收到客户端发来的SYN包,给客户端回ACK确认包,SYN = 1 ,ACK=1
- 客户端收到服务器的ACK包,并给服务器发送一个ACK确认包ACK=1 ,(SYN = 0)
此时,TCP连接建立,established
如果没有连接上,却可以ping通(网络是通的),服务器丢了RST包,一般是端口的问题。
- 为什么要三次握手
tcp在握手过程中并不携带任何数据,而是在三次握手完成之后,才会进行数据的传递
- 确定双方发送和接收能力正常,并同步连接双方的初始化序列号,为之后的可靠性传输做准备。而两次握手只有服务端对客户端的起始序列号做了确认,但客户端却没有对服务端的初始序列号做确认,不能保证传输的可靠性
- 为了防止已经失效的连接请求报文突然又传送到了服务端,因而产生了错误。客户端发起了一个连接请求,但是因为一些原因请求并未及时传递到服务器。而客户端因为长时间收不到服务器的就认为本地连接请求失败,然后就去做别的事了。而过了一段时间,之前的请求到达了服务器,服务器收到请求进行一系列操作后返回给客户端并等待客户端的响应,客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。
- 四次挥手
浏览器向服务器发送报文(Fin=1,Ack=z,Seq=x),表示客户端请求报文已经发送完了,准备关闭了。并进入到FIN_WAIT_1状态。
服务器收到客户端的断开请求后,发送确认报文(Ack=x+1,Seq=z),表示统一关闭。此时主机进入FIN_WAIT_2状态。
服务器在发送完数据以后,也会向客户端发送断开连接的报文(Fin=1,Ack=x,Seq=y),表示我没有响应数据要传了,准备关闭了。此时进入到LAST_ACK状态
客户端收到服务器的关闭请求后,会发送一个确认报文(Ack=y+1,Seq=x),表示同意关闭。服务器收到客户单的确认报文后关闭连接。而浏览器在等待一段时间后未收到回复,则正常关闭。
- SYN包攻击
SYN 包攻击是指利用 TCP 需要三次握手的特性,攻击者伪造 SYN 报文向服务器发起连接,服务器在收到报文后用 ACK 应答,但之后攻击者不再对该响应进行应答,造成一个半连接。最终会导致服务器连接资源耗尽,导致正常的 SYN 请求因为队列满而被丢弃,使得正常用户无法访问。
TCP与UDP的区别
TCP是可靠的:面向连接的,需要建立连接后才能收发数据,TCP在收发数据时有ACK机制,即数据接收方收到数据后会给数据发送方回一个ACK确认包,表示已经收到对方的数据,如果数据发送方没收到ACK包就会触发丢包重传机制
TCP是有序的:数据到达传输层时TCP协议会将乱序的包按前后顺序重组,即排好顺序后再投递给应用层
常用的网络命令
ping命令:判断是否连接到远程的地址及端口
telnet:检查服务器上的端口有没有开启监听
ipconfig /all:查看网卡的配置信息,比如IP地址,子网掩码和默认网关等
ipconfig /flushdns命令,用来清除系统中的DNS缓存
netstat命令:查看本机的网络连接与端口占用情况;具体使用netstat /?去查看详细说明
route:主要用来查看路由表、添加/删除路由 ,使用route /?
ARP:主要用来显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表
tracert命令:可以追踪访问目标地址所经历的网络节点
TCP的心跳机制和丢包重传机制
TCP心跳检测是通过定时在链路上发心跳包去保持链路的活性(keepalive),这样链路中的网络设备就不会因为链路上有段时间没有数据在跑,将链路强行断开了,libwebsockets内部的心跳检测,实际上使用的是TCP/IP协议栈的心跳检测
对于TCP连接,数据发送方将数据发出去后,会启动一个定时器,等待接收端回ACK确认包,如果在指定的时间内没有收到ACK确认包,就会触发TCP的丢包重传机制。如果发送重传包后还是没收到ACK,下一次的重传时间间隔会加倍,当重传次数达到系统上限(Windows默认的上限是5次,Linux默认的上限是15次)后,协议栈就认为网络出故障了,协议栈会直接将对应的连接关闭了。
TCP的滑动窗口、流量控制、拥塞控制
滑动窗口机制:
ACK确认包的缺点:数据包的往返时间越长,通信的效率就越低,因此引入窗口:就可以指定窗口大小,窗口大小(Window)就是指无需等待确认应答,而可以继续发送数据的最大值。
通常窗口的大小是由接收方的决定的,发送方发送的数据大小**不能超过(约等于)**接收方的窗口大小,否则接收方就无法正常接收到数据
在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。
可用窗口大 小= SND.WND -(SND.NXT - SND.UNA)
流量控制:
如果发送方一直无脑的发数据给接收方,但接收方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。
避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。
拥塞控制:
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….
拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
当 cwnd < ssthresh 时,使用慢启动算法。
当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」:每当收到一个 ACK 时,cwnd 增加 1/cwnd。当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。
抓包与网络包分析
- Windows-Wireshark抓包
- Linux-rcpdump命令抓包
HTTP是什么,HTTP和HTTPS的区别是什么
http是超文本传输协议,应用:被用于在Web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何方式的数据加密
优点:
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
安全性 | 默认端口 | 性能 | 费用 | |
---|---|---|---|---|
HTTP | 明文传输,不安全 | 80 | 较高 | 无 |
HTTPS | 使用了SSL/TLS协议进行了加密处理,更安全 | 443 | 需要设计加密以及多次握手,较低 | 高,SSL证书的价格随功能变化 |
HTTP请求 get和post的区别
同:HTTP协议中的两种发送请求的方法
- get比post更快:get会将数据缓存起来,post请求包含更多的请求头
- 主要区别:
GET产生一个TCP数据包;POST产生两个TCP数据包。:GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据
GET在浏览器回退时是无害的,而POST会再次提交请求
HTTP报文段是什么样的
HTTP报文段:有请求和响应两种,基本格式主要如下
- 起始行:请求/响应行,描述请求或响应的状态
请求起始行包括:请求方式(GET)+ 请求的资源在服务器中的相对路径(URI) + HTTP的版本
响应起始行:在最后加了状态码,表示本次请求的处理结果
- 头部字段(header):请求/响应头,以 key:value 的形式展示
- 空行(CRLF):区分两者边界,只有第一行算,若有多个空行,则其他行视为body
- 体(body):实际要传输的数据,可以是文本,也可以是图片、文件、视频等二进制数据
一个普通的get请求:
HTTP状态码
- 100~199表示消息,请求已收到继续处理
- 200~299表示成功: 200—响应成功 • 206:断点续传,或者是视频文件等大文件的加载
- 300~399表示资源重定向:301—永久重定向会缓存(换了新的url),302-临时重定向不会缓存,307-临时重定向
- 400~499表示客户端请求出错:400—客户端请求语法错误,403—服务器拒绝提供服务(内网IP) 404:客户端的请求有错误
- 500~599表示服务器端出错 500—服务器端出现错误 • 503:服务器停机维护 504:网关超时
☆在浏览器输入url地址到显示主页的过程
**DNS解析——**解析域名,获取对应的ip地址,url(包括因特网服务类型,主机,域名,端口,路径,文件名)
TCP连接——TCP三次握手:
浏览器发送http请求:行头空体
服务器处理请求并返回http报文:
浏览器解析返回的数据并渲染页面:
断开连接:TCP四次挥手:
浏览器输入URL到网页完全呈现的过程 - 简书 (jianshu.com)
计算题
主机数、子网掩码、网络地址
参考链接
【网络入门】详解常用的基础网络知识(面试笔试常考内容)_dvlinker的博客-CSDN博客_网络基础