【网络入门】详解常用的基础网络知识(面试笔试常考内容)_网络基础知识入门-程序员宅基地

技术标签: TCP与UDP  心跳机制与丢包重传  网络命令  技术入门与方向选择  网络知识  抓包分析  网络编程与网络问题分享  

目录 

1、概述

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

3、数据进入TCP/IP协议栈时的封装过程

4、端口的概念

5、TCP建立连接时的三次握手

5.1、TCP头的构成

5.2、三次握手的流程说明

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

5.4、SYN包攻击简介

6、TCP与UDP的区别及使用场景

6.1、TCP与UDP的区别

6.2、TCP与UDP的使用场景

6.3、使用TCP和UDP的常用协议

7、TCP的心跳检测机制与丢包重传机制

7.1、TCP心跳检测机制

7.2、TCP丢包重传机制

8、常用的网络命令

8.1、ping命令

8.2、telnet命令

8.3、ipconfig命令

8.4、netstat命令

8.5、route相关命令

8.6、arp命令

8.7、tracert命令

9、在Linux和Windows两个平台中抓包

9.1、在Windows系统中抓包

9.2、在Linux系统中抓包

10、最后


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

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

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进行抓包分析。接下来我们就来具体地讲解一下这些网络知识以及常用的网络命令。


       在这里,给大家重点推荐一下我的几个热门畅销专栏

专栏1:(该精品技术专栏的订阅量已达到430多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)

C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战经验为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对C++相关知识点进行详细地展开与剖析!专栏涉及了C/C++开发领域多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

VC++常用功能开发汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。


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 int
lws_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_WCE
	struct 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_WCE
	tcp_proto = getprotobyname("TCP");
	if (!tcp_proto) {
		lwsl_err("getprotobyname() failed with error %d\n", LWS_ERRNO);
		return 1;
	}
	protonbr = tcp_proto->p_proto;
#else
	protonbr = 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、tracert命令

       该命令可以追踪访问目标地址所经历的网络节点,如下所示:

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

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系统,比如UbuntuDebian等。

       好像扯的有点远了,还是回到本文的主题上来。在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工具的远程连接会话好配置选项中设置,如上图所示。

10、最后

        上面讲述了一些基础网络知识,作为IT从业人员是要掌握的,不仅工作中会用到,笔试面试也会涉及到的。如果要学习一些进阶网络知识,学习一些实际项目中遇到的网络问题排查,可以查看我之前写的另一篇文章:

【网络进阶】网络问题排查实例集锦(实战经验分享)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124643918

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenlycly/article/details/124433936

智能推荐

GB∕T 33171-2016 城市交通运行状况评价规范_城市交通运行状况评价规范 下载-程序员宅基地

文章浏览阅读407次,点赞5次,收藏8次。标准号:GB/T 33171-2016中文标准名称:城市交通运行状况评价规范 英文标准名称:Specification for urban traffic performance evaluation_城市交通运行状况评价规范 下载

ROS1与ROS2的bag包互换(包含自定义消息)_ros2的rosbag可以用ros1播放么-程序员宅基地

文章浏览阅读7.3k次,点赞8次,收藏48次。https://blog.csdn.net/shanpenghui/article/details/117282535https://blog.csdn.net/weixin_37532614/article/details/109602947https://blog.csdn.net/weixin_41010198/article/details/117042386_ros2的rosbag可以用ros1播放么

Python报错:RuntimeError: one of the variables needed for gradient computation has been modified by_python runtimeerror: one of the variables needed f-程序员宅基地

文章浏览阅读978次。Python报错:RuntimeError: one of the variables needed for gradient computation has been modified by_python runtimeerror: one of the variables needed for gradient computation ha

使用协同过滤方法来改善推荐系统的效果(Using collaborative filtering method-程序员宅基地

文章浏览阅读372次。作者:禅与计算机程序设计艺术 1.简介推荐系统是互联网领域的一个重要组成部分。随着互联网用户的增长,网站和应用都需要提供更加个性化的服务,提高用户的黏性。推荐系统帮助用户发现感兴趣的内容、产品或服务,并根据个人喜好进行排序。比如,当用户在电子商务网站上浏览商品时,推荐系统会推荐相关的商品给用户,这些推

递归法:一个实数数列共有N项,已知ai=(ai-1 - ai+1) / 2 + d_已知ai,ai-1,如何求通项公式-程序员宅基地

文章浏览阅读2.5k次。题目描述:一个实数数列共有N项,已知ai = (a_i-1 - a_i+1) / 2 + d, (1 < i < N)(N < 60)键盘输入N,d, a1, an, n, 输出 an。进行简单的代换2ai - 2d = ai-1 - ai+1 ==>ai+1 = ai-1 - 2ai + 2d ==>ai = ai-2 - 2ai-1 + 2d 2 &..._已知ai,ai-1,如何求通项公式

【机器学习小常识】“parameters(参数)” 与 “hyperparameters(超参数)”的概念及区别详解_parameters参数-程序员宅基地

文章浏览阅读8.1k次,点赞8次,收藏32次。目录1、参数与超参数概念1.什么是参数2.什么是超参数2、二者有什么区别1.得到方式不同2.影响因素不同3.可控程度不同说在前面的话有些概念其实,很纠结,它到底是属于机器学习呢,还是属于深度学习呢?比如说,分类与回归,这个有些是很难界定的,有人说,它属于深度学习,又有人说,它属于机器学习。其实争论这些,好像并无太大意义,就像一个男生对一个姑娘宠溺的说:这天下..._parameters参数

随便推点

打表法-程序员宅基地

文章浏览阅读4.8k次,点赞9次,收藏24次。今天见到了传说中的打表法,有人说这是流氓算法,但是我觉得这个也是非常牛逼的。下面就来说说这个打表法把,打表法对于某些用时较长的题目非常的有用。就是将我们要的结果打印到一个文本文档中,然后直接调用这个结果就可以了。在编译的时候就不用再程序里面计算,这样就省了很多时间,。是不是非常的牛逼呢,哈哈程序如下;#include<iostream>#include<..._打表法

Ribbon实战与原理剖析_ribbon原理-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏11次。通过实现IRule接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。}_ribbon原理

Centos 安装GPU并行lammps_centos lammps gpu-程序员宅基地

文章浏览阅读6.1k次,点赞6次,收藏16次。以下描述了如何在Centos服务器上安装GPU版本的lammps。安装环境目标属性系统Linux/CentOS 7.6CPU12*Intel Xeon CPU E5-2609 v3 @ 1.90GHzGPU2*NVIDIA Tesla K80/CUDA 8.0安装准备1. CUDA由于是安装GPU版本lammps,首先应确保系统安装有显卡所对..._centos lammps gpu

小米HR:说说对API有多少的理解? 看了后,和面试官扯皮,吹牛逼!绰绰有余!_能直接温hr是不是刷api的吗-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏32次。目录什么是API?什么是API测试API测试的测试用例:API测试方法:如何进行API测试API测试的最佳做法:API测试检测到的错误类型API测试工具API测试的挑战结论:最后什么是API?API(全称Application Programming Interface)是两个单独的软件系统之间的通信和数据交换。实现API的软件系统包含可以由另一个软件系统执行的功能/子例程。什么是API测试API测试是一种用于验证API(应用程序编程接口)的._能直接温hr是不是刷api的吗

Android开发 入门篇(二) - 常用UI控件_能(textview、edittext、button、progressbar、alertdialog-程序员宅基地

文章浏览阅读915次,点赞2次,收藏7次。date: 2020-01-12 21:46:05文章目录控件ButtonTextViewEditTextImageViewProgressBarAlertDialogProgressDialog布局LenearLayoutandroid:layout_gravityandroid:layout_weightRelativeLayoutFrameLayout百分比布局其他自定义控件ListVie..._能(textview、edittext、button、progressbar、alertdialog、progressdialog、lis

python3.4中文版下载-Python 3.4 入门指南 官方中文版.pdf-程序员宅基地

文章浏览阅读1.2k次。【实例简介】【实例截图】【核心代码】CONTENTS1 开胃菜 22 使用 Python 解释器 42.1 调用 Python 解释器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 解释器及其环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...._python_3.4_入门指南(官方中文版).pdf

推荐文章

热门文章

相关标签