1.背景
在测试过程中,出现的问题,除了代码问题,还有很多的网络问题,所以需要了解网络知识,这样能发现网络问题,尽快解决就能提高效率。
2.计算机网络体系结构
OSI七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。


OSI七层模型只是理想的,实际实现的只有4层。
3.TCP/IP协议(传输控制协议/因特网互联协议)
由网络层的IP协议和传输层的TCP协议组成,协议采用了4层的层级结构,也就是说实际上实现了链路层,网络层,传输层,应用层。

测试的过程中我们重点关注的是网络层和应用层。网络层IP,应用层HTTP,DNS是我们接触到最多的。
4.应用层协议(简单了解)
-
TFTP(Trivial File Transfer Protocol,简单文件传输协议)
用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。TFTP是一个传输文件的简单协议,它基于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。此协议设计的时候是进行小文件传输的。比如当需要将程序或者文件同时向许多机器下载时就往往需要使用到TFTP协议。 -
HTTP(Hyper Text Transfer Protocol,超文本传输协议)
是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而 [9] 消息内容则具有一个类似MIME的格式。 -
SNMP(Simple Network Management Protocol,简单网络管理协议)
SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP 接收随机消息(及事件报告)网络管理系统获知网络出现问题。SNMP是管理进程(NMS)和代理进程(Agent)之间的通信协议。 -
FTP(File Transfer Protocol,文件传输协议)
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信,使用 TCP 传输。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。比如,在大学时期,老师会在他自己的电脑建一个ftp,然后将ftp地址给学生,让学生将作业上传到ftp,老师就可以批阅。 -
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。 -
DNS(Domain Name System,域名系统)
它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。比如访问www.baidu.com,这是个域名,方便人们记忆,实际映射的是一个ip,IP不便于人们记忆。 -
Telnet
是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
应用层的这些协议没有谁更厉害,只是在不同的场景使用不同的协议,就像有的护肤品适合干性皮肤,有的适合油性皮肤。
5.传输层协议(理解端口号)
-
TCP
是面向连接的、可靠的流协议,通过三次握手建立连接,通讯完成时要拆除连接。 -
UDP
是面向无连接的通讯协议,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象。
TFTP协议使用的UDP传输,HTTP,FTP,SMTP使用TCP传输。
传输层是通过端口号,端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
通俗来说,端口号表示计算机里面的一个app,由于计算机里面有很多app,那服务器要把信息传给哪个app呢,就是通过端口号识别的,我们把每个app都设置一个端口号。

下面的图是重点记住的知识点

6.网络层协议(简单了解)
- IP(Internet Protocol,网际互连协议)
它可以向传输层提供各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。 - ICMP(Internet Control Message Protocol,=控制报文协议)
用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 - RIP(Routing Information Protocol,路由信息协议)
是基于距离矢量算法的路由协议,利用跳数来作为计量标准。在带宽、配置和管理方面要求较低,主要适合于规模较小的网络中。 - OSPF(Open Shortest Path First,路由协议)
OSPF适合在大范围的网络:OSPF协议当中对于路由的跳数,它是没有限制的,所以OSPF协议能用在许多场合,同时也支持更加广泛的网络规模。只要是在组播的网络中,OSPF协议能够支持数十台路由器一起运作。
7.三次握手和四次挥手

- 客户端与服务端传输数据—三次握手
首先要连接起来,然后再传数据。

《三次握手》的故事:
客户端:服务器,我有请求的能力,可以连接吗?(伸手)
服务器端:客户,我有接收消息和回复的能力,快来连上。(伸手)
客户端:好勒,连上成功。(握手)
传输层的TCP协议需要三次握手。
问:为什么是三次握手,不是二次握手或四次握手呢?
在TCP协议中,三次握手在可靠性和效率之间取得了平衡,而二次握手无法保证可靠性,四次握手则增加了不必要的开销。
1.二次握手的问题
无法确认服务端的接受能力:二次握手只能确认客户端的发送能力和服务端的接受能力,但无法确认服务端的发送能力和客户端的接收能力。这可能导致连接不可靠。
重复连接请求:如果客户端的SYN包延迟到达,服务端可能会误以为是新的连接请求,导致重复连接。
2.四次握手的冗余
效率低下:四次握手会增加额外的通信开销,而三次握手已经足够确保双方的发送和接受能力,四次握手显得多余。
不必要的延迟:多一次握手会增加连接建立的延迟,影响性能。
- 客户端与服务端断开联系—四次挥手

《四次挥手》的故事:
旁白:客户端和服务端信息交流结束,到了要分开的时候了。
客户端:服务器,我走了,可以吗?(示意挥手)
服务器端:你等我一下,我还没忙完。(示意稍等)
旁白:一会儿,服务器端忙完,于是去告诉客户端。
服务器端:我忙完了,你走吧,我先下线了。(示意挥手并收回手)
客户端:好的,那我走了。(示意挥手并收回手)
客户端等了一会儿消息,由于服务器下线了,没有回复客户端,于是客户端也下线了。
问:为什么是四次挥手,不是三次挥手呢?
四次挥手确保了数据传输的完整性和连接的可靠关闭,而三次挥手可能导致数据丢失,五次挥手则增加了不必要的复杂性。
1.三次挥手的问题
数据丢失风险:在三次挥手中,客户端发送FIN包后,服务端可能仍有数据需要发送。如果服务器在发送完数据前就关闭连接,可能导致数据丢失。
无法确认服务端的数据发送完毕:三次挥手无法确保服务端在关闭连接前完成所有数据的发送和确认。
2.五次挥手的冗余
不必要的复杂行:四次挥手已经能够确保双方都完成数据发送和接收,五次挥手会增加额外的步骤,带来不必要的复杂性。
效率低下:多一次挥手会增加连接关闭的延迟,影响性能。

这个请求头里面的字段Connection: keep-alive。意思就是保持客户端和服务器端连接,不要断开,否则,服务器在一段时间没有得到请求,就会断开,用户再操作的时候又要建立连接。
8.TCP/IP中的数据包
TCP首部:源IP端口号,目标IP端口号。
IP首部:源IP地址,目标IP地址,传输协议TCP
以太网包首部:里面有MAC地址,每台手机或电脑都有MAC地址来标识。查询手机电脑的MAC地址方法

场景:用户A给用户B发送信息

9.HTTP请求
- HTTP请求的传输过程。

-
浏览器输入
-
DNS解析:客户端将域名解析为IP地址
客户端检查本地DNS缓存
如果缓存中没有,客户端向DNS服务器发送查询请求
DNS服务器返回对应的IP地址 -
建立TCP连接:客户端与服务器通过TCP协议建立连接
客户端向服务器发送SYN包
服务器响应SYN-ACK包
客户端发送ACK包,完成三次握手,建立TCP连接 -
发送HTTP请求:客户端通过已建立的TCP连接发送HTTP请求
客户端构造HTTP请求报文,包括请求行(方法、URL、协议版本)、请求头(如host、User-Agent等)和请求体(如POST数据)
客户端将请求报文发送到服务器。 -
服务器处理请求:服务器接收并处理HTTP请求
服务器解析请求报文,确定请求的资源和方法。
服务器根据请求处理相应的资源,可能涉及数据库查询、文件读取等操作
服务器生成HTTP响应报文,包括状态行(协议版本、状态码、状态消息)、响应头(如Content-Type、content-length等)和响应体(如HTM内容) -
服务器发送HTTP响应:服务器将HTTP响应发送回客户端
服务器将响应报文通过TCP连接发送给客户端。
客户端接收响应报文。 -
客户端处理响应:客户端接收并处理HTTP响应
客户端解析响应报文,提取状态码、响应头和响应体。
根据响应内容,客户端进行相应操作,如渲染HTML页面、执行JavaScript代码、显示图片等。 -
关闭TCP连接:客户端和服务器关闭TCP连接。
客户端发送FIN包,请求关闭连接。
服务器响应ACK包,并发送自己的FIN包。
客户端发送ACK包,完成四次挥手,关闭TCP连接。 -
持续连接(可选)
如果使用HTTP/1.1的持久连接(keep-Alive),TCP连接可以保持打开状态,用于后续的HTTP请求和响应,减少连接建立和关闭的开销。
- HTTP 报文结构
报文结构:报文首部,空行,报文主体。
报文格式:请求报文,响应报文
报文首部:服务器端或客户端需处理的请求或响应的内容及属性。在客户端和服务器处理时起至关重要作用的信息几乎都在这里。
空行:回车符,换行符
报文主体:应被发送的数据。所需要的用户和资源的信息都在这里。
(1)请求报文结构:请求行,请求头部,回车换行,请求数据


| 方法 | 内容 |
|---|---|
| Get:从服务器端获取资源或数据。 | a.Get请求一般用于向服务器请求获取一个资源,没有副作用,一般会在客户端做缓存。b.Get请求发送数据的时候,一般会将请求数据放在url字符串中发送给服务器端,所以从安全性角度来看相对没有Post请求安全性搞,所以get请求一般不会用于比较隐私数据的传输。 |
| Post:向服务器端提交数据 | a.Post请求一般用于向服务器提交数据并让其去完成一件事,所以这个操作是有副作用的,不会在客户端做缓存。b.Post请求时将请求数据放在请求体body里面,所以一般用于表单数据,登录数据等数据的传输。 |
问:get和Post请求有什么区别?
get适合用于获取数据,数附加在URL中,安全性较低,可以被缓存,幂等。
post适合用于提交数据,数据包含在请求体中,安全性较高,不会被缓存,非幂等。
1.数据传输方式
get数据附加在URL之后,以查询字符串的形式传递,数据长度受URL长度限制(通常为2048字符)
post数据包含在请求体中,不会显示在URL中,数据长度不受URL长度限制,可以传输大量数据。
2.数据安全性
get数据在URL中可见,不适合传输敏感信息,数据可能会被浏览器历史记录,服务器日志等保存。
post数据在请求体中传输,相对更安全,适合传输敏感信息。数据不会被浏览器历史记录保存,但仍可能被服务器日志记录。‘
3.缓存
get请求可以被缓存,适合用于获取静态资源。浏览器可能会缓存get请求的结果,提高性能。
post请求不会被缓存,适合用于提交数据或执行操作。每次post请求都会被视为新的请求,不会被缓存。
4.幂等性
get幂等方法,多次执行相同的get请求不会对资源长生影响。适合用于获取数据,不会改变服务器状态。
post非幂等方法,多次执行相同的post请求可能会对资源产生不同影响。适合用于提交数据或执行操作,可能会改变服务器状态。
5.使用场景
get用于获取数据,如查询信息,获取页面内容等。例如:搜索,分页,获取资源详情
post用户提交数据,如表单提交,文件上传等。例如:用户登录,注册,提交订单
6.数据编码
get数据以URL编码形式传递,特殊字符需要转义。例如:空格转换为+或%20
post数据可以以多种编码形式,如application/x-www-form-urlencoded,mulripart/form-data,applicationg/json。
7.浏览器行为
get可以被书签保存,方便重复访问,可以被浏览器预取或预加载。
post不会被书签保存,每次提交都需要重新操作,不会被浏览器预取或预加载。
(2)响应报文结构:状态行,响应头部,回车换行,消息体


响应状态码:1,2,3开头的状态码都表示没问题,只需要等服务器即可。4开头的状态码就是客户端错误,看看客户端请求数据是否有问题,5开头的状态码就是服务器端出现错误。

| 常见状态码 | 含义 | 解决方案 |
|---|---|---|
| 404 | (Not Found)服务器无法找到请求的页面或资源。 | a.此类报错首先考虑我们的接口写的是否正确。b.其次可以检查资源的路径是否出错。 |
| 405 | (Method Not Allowed )方法不允许,方法禁用。 | a.一般出现在servlet中比较常见.就是自己的service函数写错了。b.方法名称写错,方法参数类型与标准不一致。c.方法异常、返回值类型与标准不一致。(这一般是前台的问题,我们的解决方案是:把post请求换成get请求) |
| 500 | (Internal Server Error) 服务器内部错误,不能完成客户的请求。 | a.500报错一般是后端服务器问题,但也不排除前端出错,例如后台报序列化错误,可能是因为前端没有设置content-Type=application/json。b.重要的是要查看自己写的后端业务逻辑代码有没有问题,根据报错提示查找bug。c.常见的错误位置:NullPointException,据库中提取的数据没有提取到而给另一个对象,传递了空值或注入某个对象,过程中出现空值.,没有正确获取到对象的而出现异常。 |
| 501 | ( Not Implemented)尚未实施,或请求格式错误。 | a.一般考虑我们前端写的ajax中的type:"post/get"是否出错或者from表单中的method:"post/get"是否书写错误 |
10.网络联通问题
-
查看源ip地址目的IP地址是否联通
如果源ip地址是本机,在cmd命令里面输入:ping 目的IP地址

如果源ip地址不是本机,用ip连接工具,如用MobaXterm连接源IP地址,然后命令里面输入:ping 目的IP地址

-
查看源ip地址与目的ip地址里面的应用(比如app)是否联通
输入命令: telnet IP地址 端口号
有时候两个ip联通了,但是目的ip地址的应用没有对外开放,导致源ip地址不能访问。
如果网络没联通,需要开通网策(即越过防火墙),或者开白名单(即授权使用)。
文章介绍了网络测试中遇到的问题,强调了理解网络知识的重要性。内容涵盖了OSI七层模型与实际实现的TCP/IP四层模型,详细讲解了TCP/IP协议中的网络层(如IP)、应用层(如HTTP、FTP、SMTP、DNS)以及传输层(TCP与UDP)的作用。此外,还阐述了三次握手和四次挥手的过程,以及如何检查网络联通性。
1390






