写点什么

【网络入门】详解常用的基础网络知识(面试常考内容)

作者:dvlinker
  • 2022 年 6 月 20 日
  • 本文字数:12165 字

    阅读完需:约 40 分钟

【网络入门】详解常用的基础网络知识(面试常考内容)

无论是软件开发人员,还是测试人员,亦或是运维人员,都需要掌握一些常用的基础网络知识,以用于日常网络问题的排查。这些基本的网络知识与概念,不仅日常工作会用到,跳槽时的笔试面试也会用到。本文结合多年来的工作实践,来详细讲述一下作为 IT 从业人员要掌握的一些基本网络知识。

1、概述

当前的应用系统主要分两大类,一类是 C/S(Client/Server)客户端/服务器架构的,一类是 B/S(Browser/Server)浏览器/服务器架构的。无论是 C/S 架构,还是 B/S 架构,客户端都需要和远端的服务器进行网络通信,进行数据交互。不需要进行网络通信的纯单机版的程序已经很少了。


PC 上安装的 QQ 程序,就是典型的 C/S 架构中的客户端程序,需要和远端的服务器通信,发送和接收数据。通过在浏览器中输入淘宝的网址打开淘宝的主页,就是典型的 B/S 架构,浏览器通过网址向 web 服务器请求 HTML 网页在浏览器中展现出来,也是通过网络和远端的 web 服务器进行通信。


不仅仅客户端和浏览器需要和远端平台侧的服务器进行网络通信,平台侧部署了多台服务器,比如 web 服务器、业务服务器、集群服务器、负载均衡服务器,这些服务器之间也要进行网络通信。一旦通过网络进行通信,就会不可避免地出现各种网络问题或网络故障。客户端与远端的服务器之间可能有多台服务器和网路设备,比如 DNS 服务器、路由器、交换机、集线器等,一旦客户端与服务器之间出现网络问题和数据交互问题,就可能是多个原因引起的,需要逐步地进行排查。


我们这里讲的网络问题主要有两大类,一类是客户端与服务器无法建立连接的问题,一类是建立连接后有网络延时或严重丢包问题。至于建立通信连接后,客户端与服务器之间收发的数据内容不正确等问题,可能和网络有关,也可能是业务上存在的问题导致的。对于客户端无法和服务器建立连接,可能有多种原因,可能是客户端与服务器之间的网络是不通的,也有可能是客户端使用了错误的地址或端口,也有可能服务器侧没有开启监听端口导致的,也有可能是中间的网络设备故障了或者中间网络设备启动了部分安全规则将数据包拦截了。对于网络延时和丢包问题,可能是业务上的问题,也有可能是网络不稳定,也有可能是中间的网络设备拦截数据导致的。


对于网络不稳定的场景,比如一般在家里或公司,我们尽量使用网线连接路由器,即使用有线网络,不使用无线网络。无线网络会因为距离、信号强弱等原因,会出现网络信号弱或网络不稳定,所以走无线网络可能会导致延时或丢包,与服务器频繁断链等问题。


对于网络设备拦截数据包的场景,比如网络环境中的网络设备设置了安全规则,拦截了部分或全部数据包,再比如有些路由器会拦截 SIP 协议下的 TCP 包和 UDP 包。


要排查网络通信过程中遇到的一系列网络问题,需要掌握一些基础的网络知识,了解一些常用的网络命令,必要时要使用 wireshark 进行抓包分析。接下来我们就来具体地讲解一下这些网络知识以及常用的网络命令。

2、OSI 七层模型和 TCP/IP 四层模型

OSI 七层模型和 TCP/IP 四层模型的构成,以及它们的对应关系如下所示:


OSI 七层模型的全称为开放式系统互联通信参考模型(Open System Interconnection Reference Model),它是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。OSI 参考模型分为 7 层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。


TCP/IP 的全称为传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol),它是一组用于实现网络互连的通信协议,是构建 Internet 互联网的基础,Internet 网络体系结构是以 TCP/IP 为核心的。基于 TCP/IP 的参考模型将协议分成四个层次,分别为应用层、传输层、网络层和物理链路层。也可以将物理链路层拆为两层,一个是数据链路层,一个是物理层,这样 TCPIP 模型就变成了五层一般我们使用的四层模型。


我们平时使用的都是 TCP/IP 四层模型。从 wireshark 中抓到的数据包中能看到每一层的数据信息,如下所示:


3、数据进入 TCP/IP 协议栈时的封装过程最上面的应用层的数据,进入 TCP/IP 协议栈时的封装过程如下:(以 TCP 数据为例,与 TCP/IP 四层模型相对应)


经过传输层时,会加上 TCP 头部;经过网络层时,会加上 IP 头;经过数据链路层时,会加上以太网头。对于数据接收端,会按照相反的方向,将各层的头部剥离掉,最终到上层的数据就是发送端应用层的数据。


从数据发送到接收端的整个流程,可以用下图来说明(以 QQ1 给 QQ2 发一个“你好”的聊天内容为例):


4、端口的概念


此处讲的端口是 TCP 或 UDP 通信中数字端口号,属于传输层的概念,是软件中的端口。端口号用 16 位整型数据来表示,端口的范围为 0-65535。要进行 TCP 或 UDP 通信时,除了要有 IP,必须要有端口。


操作系统会有很多默认端口,是留给指定的协议使用的,比如 21 是 ftp 协议的默认端口,80 是 http 协议的默认端口,443 是 https 协议的默认端口。作为接收客户端连接请求的服务器,可以设定自己的服务端口。


对于 TCP,需要先绑定目标端口(调用 bind),再开启对目标端口的监听(调用 listen),准备接收客户端的请求,如下所示:


对于 UDP,是无连接的,只需要绑定端口,不需要开启对端口的监听,如下所示:


如果端口已经被绑定了,即端口被占用了,再绑定这个端口会失败,除非设置了端口复用。


对于 TCP,通信前需要先建立连接,连接发起方向指定的 IP 和端口发起连接请求;被连接方,必须开启对该端口的监听(程序中调用 listen 接口开启对目标端口的监听),才能接收别人发来的请求。如果目标端口没有开启监听,是连接不上的。对于 UDP,是无连接的,直接收发数据也是需要端口的。


有时即使程序开启了端口,可能也连接不上,可能是路由器或者防火墙禁用了该端口,导致发给该端口的数据(包括连接请求)都被拦截了,此时需要在网络环境中放行该端口,即不再拦截与该端口相关的数据。比如在一些安全级别比较高的客户系统中,默认情况下很多端口都是被禁用的,我们需要给客户提供一下软件系统中使用的端口列表(包括客户端和服务器用到的所有端口),需要客户在其网络环境中放行这些端口。只有放行了这些端口,我们的软件系统才能正常的运行。


如何判断远端服务器的端口有没有开启监听,有个简单的方法,只要使用 Telnet 命令去测试即可,比如 telnet 192.168.102.176 7800。如果远端的 7800 端口没有开启监听,就是显示连接失败。如果 cmd 窗口中提示找不到 Telnet,需要到控制面板->程序与功能->启用和关闭 Windows 功能中开启 Telnet 客户端,如下图所示:


5、TCP 建立连接时的三次握手 TCP 建立连接时的三次握手是个重要的基础概念,同样也是面试时常问的一个知识点。


5.1、TCP 头的构成 TCP 建立连接的过程就是三次握手的过程,三次握手成功完成,TCP 连接就建立了。在看三次握手的完整过程之前,我们先来看一下 TCP 报文中的 TCP 头都由哪些部分构成。TCP 头的构成如下所示:


上图中有几个字段需要重点说明一下:


1)源端口和目标端口:源端口是该包数据发送者的端口,目标端口是这包数据要发送到的目的端口。


2)(包)序号:当前数据包的包序号 Seq 序号,占 4 字节(32bit),用来标识从 TCP 源端向目的端已经发送了多少字节的数据,发起方发送数据时对此进行标记。包序号的最大值是 65535,如果达到最大值,则会从 0 开始重新计数。


3)确认号:Ack 序号,占 4 字节(32bit),只有 ACK 标志位为 1 时,该确认序号字段才有效。在 TCP 中,接收端收到发送端发来的 数据后会给客户端回一个 ACK 确认包,确认收到数据了,这就是 TCP 的 ACK 机制。


当客户端给服务器发送一包数据时,假设发送该包数据时设置的序号为 seq1,本包要发送的数据长度为 len1,服务器收到这包数据后,会回给客户端一个 ACK 包,表示我服务器收到你客户端发来的这包数据了,此 ACK 包的 ACK 号等于收到的这包数据的序号 seq1,加上收到这包数据的长度 len1,该 ACK 包的 ACK 号表示我服务器一共收到了你客户端发来的多少字节数据了。注意,这个含义只是一种理解方式,因为包序号达到 65535 后会再从 0 开始计数。此外,此处说到的数据长度都是不包含 TCP 头的数据长度。


4)标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN 等,用来标记该包的类型如下:


① 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 时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。在我们使用 wireshark 抓包并分析数据包时,可以使用这些标记位作为过滤条件过滤出对应类型的包,比如使用 tcp.syn==1 过滤出发起三次握手的 SYN 包,使用 tcp.rst==1 过滤出 RST 包。


5.2、三次握手的流程说明 TCP 三次握手,是指建立一个 TCP 连接时,客户端和服务器一共发送 3 个包完成连接的建立。三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小等信息。在 socket 编程中,客户端执行 connect 接口去连接目标 IP 和端口,触发三次握手。


从 wireshark 的抓包来看,可以看出完整的三次握手的全过程:


三次握手的示意图如下:


第一次握手:


客户端发送一个 TCP 的 SYN 标志位置 1 的包,指明客户打算连接的服务器的端口,并将包的序号设置 1。


第二次握手:


服务器收到客户端发来的 SYN 包,给客户端回 ACK 确认包,包中的 SYN 标志位和 ACK 标志位设置为 1,并将 ACK 确认号设置为 1。


第三次握手:


客户端收到服务器的 ACK 包,客户端给服务器发送一个 ACK 确认包,包中的 SYN 标志位设置为 0,ACK 标志位设置为 1,并把包中的 SEQ 号设置为 1,把 ACK 号设置为 1。


服务器收到客户端发来的 ACK 包后,TCP 连接建立了,连接就编程了 established 已建立状态。


如果三次握手流程没有完成,则连接建立失败,遇到三次握手失败的情况,用 wireshark 抓包立马便能知道原因。比如有次我们的客户端登录后连不上某个业务服务器,我们第一反应就是先去 ping 一下该业务服务器地址,结果是能 ping 通,则说明网络是通的。于是直接使用 wireshark 抓包,发现当我们给业务服务器发三次握手的 SYN 包后,服务器直接回了一个 RST 包:


强行将三次握手终止了,可能是业务服务器的端口有问题。经平台侧核实,业务服务器出问题了,无故退出了,这样服务器的端口也就没有处于监听状态,所以就连接不上了。一般三次握手时直接回 RST 包,都是由端口问题引起的。


5.3、为什么必须使用三次握手,不能用两次握手去建立连接三次握手的好处:


① 三次握手目的是确认双方的接收与发送能力是否正常,同步连接双方的初始化序列号 ISN,为后面的可靠性传输做准备。而两次握手只有服务端对客户端的起始序列号做了确认,但客户端却没有对服务端的初始序列号做确认,不能保证传输的可靠性。② 三次握手可以防止已失效的连接请求报文段突然又传送到了服务端,导致服务器错误地建立连接,浪费服务端的连接资源。如果客户端发出的第一个连接请求报文并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器侧。本来这是一个早已失效的报文,但服务器收到此失效的连接请求报文后:


① 假设不采用“三次握手”,那么只要 Server 发出确认,新的连接就建立了。但由于现在 Client 并没有发出建立连接的请求,因此不会理睬 Server 的确认,也不会向 Server 发送数据。而 Server 却以为新的连接已经建立,并一直等待 Client 发来数据,这样,Server 的很多资源就白白浪费掉了② 而采用“三次握手”协议,只要 Server 收不到来自 Client 的确认,就知道 Client 并没有要求建立请求,就不会建立连接了。5.4、SYN 包攻击简介 SYN 包攻击是指利用 TCP 需要三次握手的特性,攻击者伪造 SYN 报文向服务器发起连接,服务器在收到报文后用 ACK 应答,但之后攻击者不再对该响应进行应答,造成一个半连接。假设攻击者发送大量这样的报文,那么被攻击主机就会造成大量的半连接,服务器支持的总的连接数是有限的,最终会导致服务器连接资源耗尽,导致正常的 SYN 请求因为队列满而被丢弃,使得正常用户无法访问。


这个问题我们以前遇到过,在一个项目中客户的网络环境比较复杂,其安全系统竟然向我们的业务服务器发 SYN 包攻击,导致我们的业务服务器无法提供正常的连接服务。


服务器侧有一个半连接队列和一个全连接队列。半连接队列是指,服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。对于全连接队列,完成三次握手后建立起的连接就会放在全连接队列中。


6、TCP 与 UDP 的区别及使用场景这也是面试时经常问到的点,需要搞清楚他们的区别。此处根据日常工作实践,详细地阐述一下这个话题。


6.1、TCP 与 UDP 的区别(1)TCP 是可靠传输,UDP 是不可靠传输


TCP 是面向连接的,需要建立连接后才能收发数据,TCP 在收发数据时有 ACK 机制,即数据接收方收到数据后会给数据发送方回一个 ACK 确认包,表示已经收到对方的数据,如果数据发送方没收到 ACK 包就会触发丢包重传机制,所以 TCP 是可靠的。从网络通信的 socket 套接字编程上看,必须先 connect 去连 ip 和端口先建立连接,才能使用 send 和 recv 收发数据!对于接收连接的服务端,需要先使用 bind 函数给 socket 套接字绑定端口,紧接着调用 listen 开启端口的监听,然后调用 accept 接收客户端的连接。


UDP 不需要建立连接,可以直接收发数据,没有收发数据的 ACK 机制,所以 UDP 通信是不可靠的。从网络通信的 socket 套接字编程上看,客户端直接给 sendto 函数设置 ip 和端口,不需要建立连接,直接将数据投递过去,不管数据受到与否。对于服务端,只需要使用 bind 绑定端口,然后调用 recvfrom 接收数据即可!


(2)TCP 传输的数据是有序的,UDP 数据可能是乱序的


网络层的 ip 协议不能保证数据的有序收发,所以数据接收端 ip 协议层收到的网络数据都可能是乱序的,无论是 TCP 数据还是 UDP 数据。之所以 TCP 能得到有序的数据,是因为数据到达传输层时 TCP 协议会将乱序的包按前后顺序重组,即排好顺序后再投递给应用层,所以到应用层经过 TCP 传输的数据都是有序的。而 UDP 协议没有对数据包进行排序,所以经 UDP 传输的数据到达应用层后还是乱序的,需要应用层自己去排序!


(3)其他方面的区别


此外,TCP 和 UDP 还有一些其他方面的区别:


TCP 首部长度是 20 个字节,而 UDP 的首部长度是 8 个字节,所以 TCP 数据传输的网络传输开销大一些,UDP 数据传输的开销小一些。TCP 有拥塞控制和流量控制,而 UDP 没有拥塞控制和流量控制。TCP 提供全双工通信,但不提供广播或多播服务;UDP 则提供广播和多播,所以要广播或多播,都使用 UDP。6.2、TCP 与 UDP 的使用场景 TCP 收发数据时有 ACK 机制,是可靠的,对要求数据准确无误地发送给对方的场景需要选择 TCP,比如软件中的控制信令,控制信令要保证准确无误地被投递到目的地。但也正因为接收到数据后每次都要 ACK,所以实时性要差一些。


UDP 没有数据的 ACK,直接发送数据,实时性好,对实时性要求较高且对可靠性要求不太高的场景一般都要选择 UDP。比如通信中的音视频数据,数据量比较大,数据接收端要实时地看到视频听到声音,所以需要保证实时性,要有较低的延时,即使有少量的丢包也是没多大问题的,所以音视频数据都是通过 UDP 来传输的,比如 QQ 和微信的音视频、视频会议中音视频、直播中的音视频。


上面讲述了 TCP 与 UDP 区别的关键点,很多同学可以留意一下,下次面试再被问到时一定要说到关键点上!


6.3、使用 TCP 和 UDP 的常用协议 TCP 是可靠的,能将数据准确无误的传递给对方,一般处理文件传输的 HTTP、HTTPS、FTP 协议、用于发送和接收邮件的 POP3、SMTP 等邮件传输协议,使用的都是 TCP。对实时性要求高且对可靠性要求低的协议则使用 UDP。


(1)TCP 对应的协议:


FTP:文件传输协议,默认使用 21 端口。Telnet:远程终端接入,默认使用 23 端口,用户可以以自己的身份远程连接到计算机上,可提供基于 DOS 模式下的通信服务。SMTP:邮件传送协议,用于发送邮件,默认使用 25 端口。POP3:邮件传送协议,P 用于接收邮件,默认使用 110 端口。HTTP:万维网超文本传输协议,是从 Web 服务器传输超文本到本地浏览器的传送协议,默认使用 80 端口。(2)UDP 对应的协议:


DNS:域名解析服务,将域名地址转换为 IP 地址,默认使用 53 号端口。SNMP:网络管理协议,用来管理网络设备,默认使用 161 号端口。TFTP:简单文件传输协议,提供不复杂、开销不大的文件传输服务,默认使用 69 端口。NFS:远程文件服务器。RIP:路由信息协议。DHCP:动态主机配置协议。IGMP:网际组管理协议。7、TCP 的心跳检测机制与丢包重传机制 TCP 心跳检测和丢包重传机制是 TCP 的两个重要特性,其中丢包重传机制也是保证可靠传输的一种机制。这两种机制都要搞清楚,下面我们就来大概的讲述一下。


7.1、TCP 心跳检测机制 TCP 心跳检测是通过定时在链路上发心跳包去保持链路的活性(keepalive),这样链路中的网络设备就不会因为链路上有段时间没有数据在跑,将链路强行断开了。


以上是 TCP/IP 协议栈的心跳机制,有时我们应用层会添加一个应用层的心跳检测,比如客户端可以给服务器发心跳包,根据服务器的回应情况来判断服务器是否还活着,客户端和服务器之间的网络是否出现问题,如果心跳检测异常,客户端会主动断开与服务器的连接。


大家经常使用的 libwebsockets 开源库支持设置心跳检测参数,默认情况下是不启用心跳检测的。libwebsockets 内部的心跳检测,实际上使用的是 TCP/IP 协议栈的心跳检测,将心跳检测参数设置给对应的 socket,libwebsockets 内部相关的接口如下所示:(调用 WSAIoctl 接口给 socket 套接字设置心跳参数)


LWS_VISIBLE intlws_plat_set_socket_options(struct lws_vhost *vhost, lws_sockfd_type fd){int optval = 1;int optlen = sizeof(optval);u_long optl = 1;DWORD dwBytesRet;struct tcp_keepalive alive;int protonbr;#ifndef _WIN32_WCEstruct protoent *tcp_proto;#endif


if (vhost->ka_time) {  /* enable keepalive on this socket */  // 先调用setsockopt打开发送心跳包(设置)选项  optval = 1;  if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,             (const char *)&optval, optlen) < 0)    return 1;
alive.onoff = TRUE; alive.keepalivetime = vhost->ka_time*1000; alive.keepaliveinterval = vhost->ka_interval*1000;
if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0, &dwBytesRet, NULL, NULL)) return 1;}
/* Disable Nagle */optval = 1;
复制代码


#ifndef _WIN32_WCEtcp_proto = getprotobyname("TCP");if (!tcp_proto) {lwsl_err("getprotobyname() failed with error %d\n", LWS_ERRNO);return 1;}protonbr = tcp_proto->p_proto;#elseprotonbr = 6;#endif


setsockopt(fd, protonbr, TCP_NODELAY, (const char *)&optval, optlen);
/* We are nonblocking... */ioctlsocket(fd, FIONBIO, &optl);
return 0;
复制代码


}7.2、TCP 丢包重传机制对于 TCP 连接,数据发送方将数据发出去后,会启动一个定时器,等待接收端回 ACK 确认包,如果在指定的时间内没有收到 ACK 确认包,就会触发 TCP 的丢包重传机制。如果发送重传包后还是没收到 ACK,下一次的重传时间间隔会加倍,当重传次数达到系统上限(Windows 默认的上限是 5 次,Linux 默认的上限是 15 次)后,协议栈就认为网络出故障了,协议栈会直接将对应的连接关闭了。


所以当网络出现故障时有数据交互,协议栈会在数十秒内检测到网路出现异常,就会直接将连接直接关闭掉。丢包重传机制的详细描述如下所示:


8、常用的网络命令这里主要介绍一下 Windows 系统下一些常用的网络相关命令。Linux 系统也有对应的命令,后面会写一篇关于 Linux 命令文章,此处就不再就 Linux 系统的命令进行详细展开了。这些命令均是在命令行窗口中执行的,可使用“命令名 /?”去查看命令支持参数和使用上的说明,还会有使用范例。


8.1、ping 命令当无法连接到远端的地址及端口时,我们最先想到的是,先 ping 一个远端的地址,看看网络是不是通的,如下:


如果软件系统在交互的过程中数据出现延时或抖动,可以在 ping 指令后面加上一个-t 的参数,比如 ping 192.168.0.1 -t,查看连续的 ping 包,看网络是否存在明显的延迟或抖动,如下:


如果要停止持续的 ping,按下 Ctrl+C 组合键就可以终止当前命令的执行。


8.2、telnet 命令 telnet 命令其实对应的是 telnet 客户端程序(telnet.exe),该程序使用的是 telnet 协议。telnet 协议是 TCP/IP 协议族中的一员,是远程登陆服务的标准协议和主要方式,它为用户提供了从本地计算机远程登录远程主机的能力。


使用该命令可以检查服务器上的端口有没有开启监听,比如 telnet 192.168.100.196 7800,如果 7800 端口没有开启监听,则会提示连接失败。


如果远端开启了 telnet 服务器,可以使用 telnet 命令远程登录到该 telnet 服务器上。如果 cmd 窗口中提示找不到 Telnet,需要到控制面板->程序与功能->启用和关闭 Windows 功能中开启 Telnet 客户端,如下所示:


8.3、ipconfig 命令 ipconfig 命令主要用来查看网卡的配置信息,比如 IP 地址,子网掩码和默认网关等,一般使用 ipconfig /all,如下所示:


还有比较常用的是 ipconfig /flushdns 命令,用来清除系统中的 DNS 缓存:


这样在发起新的域名解析请求时,会向域名服务器上去实时地查询最新的 IP。比如某时某个域名对应的 IP 变更了,但 Windows 系统 DNS 缓存中有域名-IP 对的记录,导致程序使用的还是老的 IP,出现访问失败的问题。所以出现域名访问失败的时候,可以尝试使用 ipconfig /flushdns 命令刷新系统 DNS 缓存。


经常有朋友询问使用 DNS 系统查询 IP 的完整流程,这里我们普及一下这一过程。DNS 服务器大致分为三种类型:根 DNS 服务器、顶级域 DNS 服务器和权威 DNS 服务器,其中顶级域 DNS 服务器主要负责诸如 com、org、net、edu、gov 等顶级域名。


  根DNS服务器存储了所有顶级域DNS服务器的 IP 地址,可以通过根服务器找到顶级域服务器,比如百度的域名www.baidu.com,根服务器会返回所有维护 com 这个顶级域服务器的 IP 地址。然后你任选其中一个顶级域服务器发送请求,该顶级域服务器拿到域名后能够给出负责当前域的权威服务器地址。以 百度的域名为例,顶级域服务器将返回所有负责百度这个域的权威服务器地址。接着任选其中一个权威服务器地址查询“www.baidu.com”的具体 IP 地址,最终权威服务器会返回给你具体的 IP 地址。此外,本地 DNS 服务器是具有缓存功能的,通常两天内的记录都会被缓存。
复制代码


所以,通过 DNS 系统查询域名对应的 IP 的具体步骤可以总结为:


① 操作系统先查本地 hosts 文件 中是否有记录,如果有,则直接返回相对应映射的 IP 地址。② 如果本地 hosts 文件中没有配置,则主机向自己的本地 DNS 服务器发送查询报文,如果本地 DNS 服务器缓存中有,将直接返回结果。③ 如果本地服务器缓存中没有,则从内置在内部的根 DNS 服务器列表(全球 13 台,固定的 IP 地址)中选一个发送查询报文。④ 根服务器解析域名中的后缀名,告诉本地服务器负责该后缀名的所有顶级服务器列表。⑤ 本地服务器选择其中一个顶级域服务器发送查询请求,顶级域服务器拿到域名后继续解析,返回对应域的所有权威服务器列表。⑥ 本地服务器再向返回的权威服务器发送查询报文,最终会从某一个权威服务器上得到具体的 IP 地址。⑦ 主机返回结果 IP。8.4、netstat 命令 netstat 命令用来查看本机的网络连接与端口占用情况,如下:


netstat 命令支持多个参数,具体使用 netstat /?去查看详细说明:


这里就不再赘述了。


8.5、route 相关命令 route 相关命令主要用来查看路由表、添加/删除路由等。首先来看看 route print 命令,该命令是将 Windows 系统中的路由表打印出来,如下图所示:


route add 命令可以往路由表中添加一条路由,route delete 命令可以删除一条路由。命令具体怎么使用可以使用 route /?命令查看一下参数的说明以及范例:


一般在处理 Windows 系统中的多网卡问题时,会用到这些路由相关的命令。比如以前我们遇到的一个场景,Windows 系统中有两张网卡,一张是连接局域网的内网网卡,一张是连接外网的外网网卡:


Windows 系统中只能设置一个默认网关,外网网卡的 IP 和默认网关是从路由器自动获取的,肯定是有默认网关的,所以内网的网卡不能设置默认网关。如果要通过内网的网卡访问局域网中的地址,则需要使用 route add 命令添加策略路由来控制 ip 的访问走向,即通过策略路由让访问内网地址的都走内网的网关。给内网的网卡添加策略路由的命令为:


route add 172.16.0.0 mask 255.255.0.0 172.16.30.186(172.16.30.186 为内网中的网关)


该命令的含义是,所以访问 172.16 开头的地址时,都通过内网的网关 172.16.30.186 走出去。服务器上一般都会配置多个网卡,有时也会通过添加策略路由去处理服务器之间无法访问的问题,这样的场景我们都遇到过。


8.6、arp 命令该 arp 命令主要用来显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表:


系统中会保存 IP 和 MAC 地址的映射表。其中 ARP 协议(Address Resolution Protocol),是根据 IP 地址获取物理地址的一个 TCP/IP 协议。主机发送信息时将包含目标 IP 地址的 ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该 IP 地址和物理地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源。


可以使用 arp -a 的命令查看系统缓存的映射表,使用 arp -s 保存一个 IP 和 MAC 地址的映射对,使用 arp -d 删除符合条件的映射对,条件中支持使用通配符,比如:arp -d 192.168..


这里我们详细介绍一下 ARP 协议,它是根据 IP 地址获取 MAC 地址的一种协议,核心原理就是广播发送 ARP 请求,单播发送 ARP 响应。关于 ARP 相关流程的说明如下:


① 每个主机都在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。② 当源主机要发送数据时,先检查 ARP 列表中是否有该 IP 地址对应的 MAC 地址,如果有,则直接发送数据;如果没有,就向本网段的所有主机发送 ARP 数据包,用于查询目的主机的 MAC 地址,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP。③ 当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。④ 源主机收到 ARP 响应包后,将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。8.7、traccert 命令该命令可以追踪访问目标地址所经历的网络节点,如下所示:


通过该命令,可以看出数据包是从那个网卡发出去的(看默认网关),也可以看出从哪个运营商线路(联通线路、移动线路、电信线路)访问到目标地址的!


9、在 Linux 和 Windows 两个平台中抓包出现网络问题后,最直接最有效的办法就是抓包,对抓到的网络包进行分析,有时不仅要在客户端抓包,还要在服务器抓包,要综合分析。 服务器一般是运行在 Linux 系统之上的,所以此处也简单的介绍一下如何在服务器上使用 tcpdump 命令抓包。


9.1、在 Windows 系统中抓包 Windows 上抓包很简单,只要在系统中安装 wireshark 即可。启动 wireshark 后,选择要抓包的那个网卡:


开启抓包即可。抓完包之后,可以将抓包数据保存到文件中。接下来就是分析抓包文件,抓包文件中是抓取了整个网卡的数据包,而我们要分析的是我们软件中的数据包,所以要用过滤条件将要查看的包过滤出来。


数据包的过滤条件很讲究,可以使用 ip 或端口进行过滤,也可以通过协议去过滤,比如如下的一些过滤条件:


① 用 ip 地址过滤,比如 ip.addr==192.168.2.1、ip.src==192.168.2.1、ip.dst==192.168.2.1;② 用端口来过滤,比如 tcp.port==7800、tcp.srcport==7800、tcp.dstport==7800、udp.port==7800;③ 使用协议过滤,比如 tcp、udp、http、websocket、xmpp、rtp 等协议名称进行过滤,比如下图:


④ 上面我们还说过,可以使用 tcp.syn==1 来过滤三次握手的 SYN 包;⑤ 使用数据包的字符串来过滤,比如 http contains "destport"、xmpp contains “123”。具体使用什么过滤条件,要具体问题具体分析吧。


9.2、在 Linux 系统中抓包


服务器中一般使用的是 Linux 操作系统,比如最常用的是 CentOS 系统。当然 CentOS 开发商 Red Hat(红帽)公司已经宣布不再对 CentOS 进行维护更新了,对于大多数国产 IT 厂商是个很不好的消息。好在华为、阿里和腾讯快速地推出了 CentOS 的替代服务器操作系统,华为发布了欧拉系统、阿里发布了龙蜥系统、腾讯发布了 TencentOS 系统,这些服务器操作系统都是在开源的 Linux 系统演化而来的,也都开源了,大家都可以使用。鉴于华为在鸿蒙手机操作系统上的卓越表现,很多厂商都选择了使用华为的欧拉系统,有的厂商则选择继续使用国外的 Linux 系统,比如 Ubuntu、Debian 等。


好像扯的有点远了,还是回到本文的主题上来。在 Linux 上抓包之前,我们需要使用 SSH 工具远程登录到 Linux 系统中,登录到 Linux 系统的命令行上,然后在 Linux 命令行中使用 tcpdump 命令启动抓包,比如使用如下的命令:


tcpdump –i eth1 –s 0 –w dsvserver.pcap


该命令中使用-i 指定在哪个网卡上抓包,eth1 是网卡名称,如果要抓所有网卡上的包,则使用-i any;-s 指定生成的抓包文件的大小,以字节为单位,0 表示不限制;-w 指定抓包文件的名称。


开启该命令后,服务器上一直在抓包,可以按下 Ctrl+C 停止抓包命令的执行。然后使用 sz 命令:


sz dsvserver.pcap


将刚才生成的抓包下载到当前的 Windows 系统中,最后在 Windows 系统中使用 WireShark 打开抓包文件分析即可。


sz 命令(Send ZMODEM)通过 ZMODEM 协议,可将文件从远程的服务器下载到本地来。比如我们要取日志文件,也可以使用 sz 命令下载到本地来。关于下载的保存路径,可以在 SSH 工具的远程连接会话好配置选项中设置,如上图所示。

用户头像

dvlinker

关注

还未添加个人签名 2022.06.19 加入

还未添加个人简介

评论

发布
暂无评论
【网络入门】详解常用的基础网络知识(面试常考内容)_dvlinker_InfoQ写作社区