精华内容
参与话题
问答
  • 2021最新Java面经整理 | 计算机网络篇 一、网络层次划分 ...TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有...

    2021最新Java面经整理 | 计算机网络篇

    目录

    一、网络层次划分

    1.1 应用层

    1.2 传输层

    1.3 网络层

    1.4 数据链路层

    1.5 物理层

    二、TCP/IP协议(重点)

    1、概述

    2、TCP报文首部格式

    3、TCP协议的三次握手和四次挥手

    三、UDP协议 

    1、UDP的概述(User Datagram Protocol,用户数据报协议)

    2、使用场景

    3、UDP的首部格式

    四、TCP和UDP的区别

    五、TCP如何保证可靠传输

    1、校验和

    2、确认应答与序列号

    3、超时重传

    4、连接管理

    5、流量控制

    6、拥塞控制

    六、TCP的三次握手四次挥手

    1、TCP报文格式

    2、三次握手

    3、四次挥手

    4、为什么三次握手和四次挥手?

    5、为什么客户端最后还要等待2MSL?

    七、TCP的粘包和拆包

    1、粘包、拆包表现形式

    2、粘包、拆包发生原因

    3、粘包、拆包解决办法

    八、其他协议

    1、DNS协议

    2、ARP/RARP协议

    3、NAT协议

    4、DHCP协议

    5、HTTP协议

    九、HTTP 与 HTTPS

    1、基本概念

    2、HTTP 与 HTTPS 区别

    3、HTTPS 的工作原理

    十、一个完整的HTTP请求流程

    1、示例一

    2、示例二

    3、示例三

    十一、其他问题

    1、HTTP长连接、短连接

    2、HTTP 1.0和HTTP 1.1的主要区别是什么?

    3、HTTP是不保存状态的协议,如何保存用户状态?

    4、状态码

    5、URI和URL的区别是什么?

    6、Cookie和Session的区别:

    7、理解cookie,session,token


    一、网络层次划分

    计算机网络体系结构的通信协议划分为七层,自上而下依次为:

    • 应用层(Application Layer)
    • 表示层(Presentation Layer)
    • 会话层(Session Layer)
    • 传输层(Transport Layer)
    • 网络层(Network Layer)
    • 数据链路层(Data Link Layer)
    • 物理层(Physics Layer)

    除了标准的OSI七层模型以外,常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议,它们之间的对应关系如下图所示:

     

    TCP/IP协议毫无疑问是互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。不管是OSI七层模型还是TCP/IP的四层、五层模型,每一层中都要自己的专属协议,完成自己相应的工作以及与上下层级之间进行沟通。下面以五层协议的体系结构为例,

    1.1 应用层

    应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。

    • 域名系统(Domain Name System缩写 DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
    • 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。

    1.2 传输层

    传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。

    传输层主要使用以下两种协议:

    1. 传输控制协议 TCP(Transmission Control Protocol)--提供面向连接的,可靠的数据传输服务。
    2. 用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

    1.3 网络层

    在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。

    这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。

    这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.

    互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Protocol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。

    1.4 数据链路层

    数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

    在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

    1.5 物理层

    在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

    在互联网使用的各种协中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议,而往往表示互联网所使用的整个TCP/IP协议族。

     

    二、TCP/IP协议(重点)

    1、概述

    TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

    IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

    TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。

    2、TCP报文首部格式

    3、TCP协议的三次握手和四次挥手

    使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。

    下图注:seq:"sequance"序列号;ack:"acknowledge"确认号;SYN:"synchronize"请求同步标志;;ACK:"acknowledge"确认标志"FIN:"Finally"结束标志。

    1)TCP连接建立过程(三次握手)

    首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

    2)TCP连接断开过程(四次挥手)

    假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

    3)为什么要三次挥手?

    在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据...问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!

    4)为什么要四次挥手?

    试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行。

     

    三、UDP协议 

    1、UDP的概述User Datagram Protocol,用户数据报协议

    UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用分用以及差错检测

    UDP提供不可靠服务,具有TCP所没有的优势

    • UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势。

    • 分组首部开销小,TCP首部20字节,UDP首部8字节。

    • UDP没有拥塞控制,应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用要求以稳定的速度发送,能容 忍一些数据的丢失,但是不能允许有较大的时延(比如实时视频,直播等)

    • UDP提供尽最大努力的交付,不保证可靠交付。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息

    • UDP是面向报文的,对应用层交下来的报文,添加首部后直接乡下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。正是因为这样,UDP显得不够灵活,不能控制读写数据的次数和数量。比如我们要发送100个字节的报文,我们调用一次sendto函数就会发送100字节,对端也需要用recvfrom函数一次性接收100字节,不能使用循环每次获取10个字节,获取十次这样的做法。

    • UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,因为对于这些应用,若是采用TCP,为连接的创建,维护和拆除带来不小的开销。UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的

    2、使用场景

    UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。

    使用场景:由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

    使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。

    3、UDP的首部格式

    UDP数据报分为首部和用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中,UDP数据报文结构如下,

    UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,

    • 源端口: 源端口号,需要对方回信时选用,不需要时全部置0.
    • 目的端口:目的端口号,在终点交付报文的时候需要用到。
    • 长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)
    • 校验和:检测UDP数据报在传输中是否有错,有错则丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0.

    当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。如果接收方UDP发现收到的报文中的目的端口号不正确(不存在对应端口号的应用进程0,),就丢弃该报文,并由ICMP发送“端口不可达”差错报文给对方。

    TCP  UDP 的区别:TCP是面向连接的,可靠的字节流服务;UDP是面向无连接的,不可靠的数据报服务。

     

    四、TCP和UDP的区别

    TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。

    UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制。

    总结:

    • TCP:面向连接,提供可靠的服务,有流量控制,拥塞控制,无重复、无丢失、无差错,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),只能是点对点,首部 20 字节,全双工。
    • UDP:无连接,尽最大努力交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对多,首部 8 字节。

    五、TCP如何保证可靠传输

    TCP协议传输的特点主要就是面向字节流、传输可靠、面向连接。TCP协议保证数据传输可靠性的方式主要有:

    • 校验和
    • 序列号
    • 确认应答
    • 超时重传
    • 连接管理
    • 流量控制
    • 拥塞控制

    1、校验和

    计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。

    发送方:在发送数据之前计算检验和,并进行校验和的填充。

    接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。

    2、确认应答与序列号

    序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。

    确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。

    序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一。

    3、超时重传

    主要是针对丢包,简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

    4、连接管理

    连接管理就是三次握手与四次挥手的过程,在前面详细讲过这个过程,这里不再赘述。保证可靠的连接,是保证可靠性的前提。

    5、流量控制

    接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。

    6、拥塞控制

    TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。

    所以TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口。

    拥塞控制是TCP在传输时尽可能快的将数据传输,并且避免拥塞造成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。

    详细参看:https://blog.csdn.net/liuchenxia8/article/details/80428157

     

    六、TCP的三次握手四次挥手

    1、TCP报文格式

    在了解三次握手和四次挥手之前,先知道TCP报文内部包含了哪些东西。

    • TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…)。
    • 报文主要字段,
      • 序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
      • 确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
      • ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
      • SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
      • FIN:结束标志,用于释放连接,为1表示关闭本方数据流

    2、三次握手

    1)三次握手过程

    建立TCP连接时,需要客户端和服务器共发送3个包。

    • 第一次:客户端发送初始序号x和syn=1请求标志
    • 第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
    • 第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

     

    2)三次握手过程分析

    • 第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。SYN=1,seq=x
    • 第二次:服务器发给客户端,客户端知道自己发送、接收正常,服务器接收、发送正常。ACK=1,ack=x+1,SYN=1,seq=y
    • 第三次:客户端发给服务器:服务器知道客户端发送,接收正常,自己接收,发送也正常.seq=x+1,ACK=1,ack=y+1

    上面分析过程可以看出,握手两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论的。

    3、四次挥手

    1)四次挥手过程

    • 第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
    • 第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
    • 第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
    • 第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

    2)四次挥手过程分析

    • 第一次:客户端请求断开FIN,seq=u
    • 第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v
    • 第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1
    • 第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1

    4、为什么三次握手和四次挥手?

    1)三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里。

    2)四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

    5、为什么客户端最后还要等待2MSL?

    客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。

     

    七、TCP的粘包和拆包

    TCP网络传输过程中,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。

    TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议。那么UDP是否会发生粘包或拆包的现象呢?答案是不会。UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;另外从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。

    1、粘包、拆包表现形式

    现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下:

    第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不在本文的讨论范围内。

    第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

    第三种情况,这种情况有两种表现形式,如下图。接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。

    2、粘包、拆包发生原因

    发生TCP粘包或拆包有很多原因,现列出常见的几点,

    • 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
    • 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
    • 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
    • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

    3、粘包、拆包解决办法

    通过以上分析,我们清楚了粘包或拆包发生的原因,那么如何解决这个问题呢?解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下几个:

    • 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
    • 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
    • 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

     

    八、其他协议

    1、DNS协议

    DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务,可以简单地理解为将URL转换为IP地址。域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在Internet上域名与IP地址之间是一一对应的,DNS就是进行域名解析的服务器。DNS命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。

    2、ARP/RARP协议

    地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。

    3、NAT协议

    NAT网络地址转换(Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

    4、DHCP协议

    DHCP动态主机设置协议(Dynamic Host Configuration Protocol)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

    5、HTTP协议

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

    HTTP 协议包括哪些请求?

    • GET:请求读取由URL所标志的信息。
    • POST:给服务器添加信息(如注释)。
    • PUT:在给定的URL下存储一个文档。
    • DELETE:删除给定的URL所标志的资源。

    HTTP 中, POST  GET 的区别

    • Get是从服务器上获取数据,Post是向服务器传送数据。
    • Get是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中可以看到。
    • Get传送的数据量小,不能大于2KB;Post传送的数据量较大,一般被默认为不受限制。
    • 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
      • 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
      • 幂等 的意味着对同一URL的多个请求应该返回同样的结果。

     

    九、HTTP 与 HTTPS

    1、基本概念

    1)HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。

    HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

    2)HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

    HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:

    • TCP 三次同步握手
    • 客户端验证服务器数字证书
    • DH 算法协商对称加密算法的密钥、hash 算法的密钥
    • SSL 安全加密隧道协商完成
    • 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

    2、HTTP 与 HTTPS 区别

    • HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
    • 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
    • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
    • HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
    • HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

    3、HTTPS 的工作原理

    我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。

    1)客户端发起 HTTPS 请求

    这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

    2)服务端的配置

    采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。

    这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

    3)传送证书

    这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

    4)客户端解析证书

    这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。

    如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

    5)传送加密信息

    这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

    6)服务端解密信息

    服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

    7)传输加密后的信息

    这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

    8)客户端解密信息

    客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

     

    十、一个完整的HTTP请求流程

    1、示例一

    在浏览器中输入url地址,显示主页的过程?

    总体来说分为以下几个过程,详见图解,

    1. DNS解析
    2. TCP连接
    3. 发送HTTP请求
    4. 服务器处理请求并返回HTTP报文
    5. 浏览器解析渲染页面
    6. 连接结束

    2、示例二

    在浏览器中输入 http://www.baidu.com 后执行的全部过程?

    现在假设如果我们在客户端(客户端)浏览器中输入http://www.baidu.com,而baidu.com为要访问的服务器(服务器),下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作:

    1)客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

    2)在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

    3)客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

    4)客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

    3、示例三

    当我们在web浏览器的地址栏中输入: www.baidu.com,然后回车,到底发生了什么?

    全过程如下,

    1. 对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
    2. 根据这个IP,找到对应的服务器,发起TCP的三次握手
    3. 建立TCP连接后发起HTTP请求
    4. 服务器响应HTTP请求,浏览器得到html代码
    5. 浏览器解析html代码,并请求html代码中的资源(如js、css图片等)(先得到html代码,才能去找这些资源)
    6. 浏览器对页面进行渲染呈现给用户

    注意:

    • DNS域名解析采用的是递归查询的方式,过程是,先去找DNS缓存->缓存找不到就去找根域名服务器->根域名又会去找下一级,这样递归查找之后,找到了,给我们的web浏览器。
    • 为什么HTTP协议要基于TCP来实现?  TCP是一个端到端的可靠的面相连接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(当发生错误时,会重传)。
    • 最后一步浏览器是如何对页面进行渲染的?  
      • a)解析html文件构成 DOM树,
      • b)解析CSS文件构成渲染树,  
      • c)边解析,边渲染 ,  
      • d)JS 单线程运行,JS有可能修改DOM结构,意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程,会阻塞后续资源下载。

    详细可查看:一次完整的HTTP请求过程

     

    十一、其他问题

    1、HTTP长连接、短连接

    在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

    而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive

    在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

    HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

    2、HTTP 1.0和HTTP 1.1的主要区别是什么?

    HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

    1. 长连接 : 在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP 是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP 1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。
    2. 错误状态响应码 :在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
    3. 缓存处理 :在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
    4. 带宽优化及网络连接的使用 :HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

    3、HTTP是不保存状态的协议,如何保存用户状态?

    HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。那么我们保存用户状态呢?Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个Session)。

    在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。

    Cookie 被禁用怎么办?

    最常用的就是利用 URL 重写把 Session ID 直接附加在URL路径的后面。

    4、状态码

    5、URI和URL的区别是什么?

    • URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
    • URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

    URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。

    6、Cookie和Session的区别:

    1)cookie数据存放在客户的浏览器上,session数据放在服务器上。
    2)cookie不安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
    3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
    4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
    所以建议:

    • 将登陆信息等重要信息存放为session
    • 其他信息如果需要保留,可以放在cookie中

    7、理解cookie,session,token

    详细可参考:https://blog.csdn.net/qq_31201781/article/details/94575507

    1)Cookie

    cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

    cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

    2)Session

    session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

    session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

    服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

    3)Token

    在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。以下几点特性会让你在程序中使用基于Token的身份验证,

    • 无状态、可扩展
    • 支持移动设备
    • 跨程序调用
    • 安全

    很多基于Token的身份验证的大佬们的API和Web应用都使用tokens。例如Facebook, Twitter, Google+, GitHub等。

    但是Token也有缺点:比如Token作废问题。

    Token作废问题
    当用户退出登录、修改密码之后,讲道理我们是需要作废之前的Token,比如说用户的Token被盗用了,只能通过修改密码来防止账号被盗用。如果使用session机制就很简单了,我们清空服务器session,或者使用新的session替换之前旧的session也行。
    由于Token是无状态的,理论上只要不过期就可以一直用,你说这咋办?为了安全,必须得做一些额外的工作!
    1.Cache
    如果你之前是采用把Token存在cache里面这种方案,那么你只要删除cache里面的key就可以了。不过如果你真的是采用这种方案,还不如直接用session,这时候的Token和sessionid没区别。
    2.用户关联
    有人说,建一张表把uid和Token关联起来,这样一个用户只有一个有效的Token,或者存cache也行,建立uid和Token的一对一关系,这方案和1差不多。无论是存表还存cache,每次访问都必不可免的需要访问库或cache。
    3.黑名单
    在数据表或cache里面维护一个黑名单,也避免不了查库或者查cache,为了避免这个库内容过多,可以定期清理数据库,或者给cache设置一个有效期。比如说在上面说的例子里面,有效期应该设置为30天,30天之后就不用管了。
    其实我比较喜欢第3种方案,第2种方案如果用户多了对库压力大,而第3种,除非用户经常修改密码或者退出登录,不然这个数据集不会很大。
    如果不考虑安全,我们完全可以不考虑Token作废问题,那么我们就必须在防止XSS攻击上面做好工作,比如说使用https,cookies设置httpOnly。。。

     

     

    展开全文
  • 服务端编程(一) 一.node基础 1.学习NodeJS的意义 了解客户端浏览器与服务端后台的交互过程,可以在以后的前端开发工作中与后台人员之间的沟通更加容易理解 虽然以后工作中不一定用的上nodejs,能够在日常工作中与...

    服务端编程(一)

    一.node基础

    1.学习NodeJS的意义

    • 了解客户端浏览器与服务端后台的交互过程,可以在以后的前端开发工作中与后台人员之间的沟通更加容易理解

      • 虽然以后工作中不一定用的上nodejs,能够在日常工作中与公司后台人员之间的沟通变得更加轻松
    • 了解服务端开发的一些特性,当我们前端与后台交互出现bug问题时,能够更快速的定位bug是出现在自己的客户端还是别人的服务端。

    • 了解服务端开发的过程,可以为以后的职业发展打下一定的基础(全栈工程师)

    2.什么是nodejs

    • Node.js官网地址:https://nodejs.org/en/
    • 中文:http://nodejs.cn/api/
    • Node 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境
      • Node一个运行环境,作用是让js拥有开发服务端的功能
    • *Node使用事件驱动非阻塞IO模型 异步读写–异步非阻塞)使得它非常的轻量级和高效
      • Node中绝大多数API都是异步(类似于ajax),目的是提高性能
    • Node中的NPM是世界上最大的开源库生态系统(类似于github)
    1. 事件驱动:通过事件或状态的变化来进行应用程序的流程控制,一般通过事件监听完成,一旦事件被检测到,则调用相应的回调函数。
    2. 非阻塞IO模型:非阻塞,意味着不用等待前一个IO操作返回就可以直接执行其他的IO操作。
    3. 异步操作的两大特点
    	3.1 异步非阻塞:异步操作不会阻塞后面代码的执行
    	3.2 异步操作的执行顺序不依赖于异步操作代码的书写顺序
    

    3. Node.js环境安装

    3.1如何确认当前电脑是否已经安装了Node环境

    • 打开终端,输入 node -v,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令,则表示未安装
      • 一旦安装了node,则会自动一并安装npm

    4. 服务端js与客户端js区别

    • 客户端JavaScript由三部分组成

      • ECMAScript:确定js的语法规范
      • DOM:js操作网页内容
      • BOM:js操作浏览器窗口
    • node中的JavaScript

      • 组成
        • ECMAScript
        • 核心模块
        • 第三方模块
      • 基本的语法和写法和之前的js没有本质的区别
      • 在nodejs中使用dom与bom的api程序会报错
        • 服务器端没有界面
        • 压根不需要操作浏览器和页面元素
      • 同样的,在html中写node代码也会报错
        • 后台代码的运行需要后台的运行环境
    • 第一个node.js代码

      let arr = [1, 3, 5, 7, 9]
      for (let i = 0; i < arr.length; i++) {
        console.log(i)
      }
      
      // 浏览器中的js的组成:
      // ECMAScript  + dom  + bom
      // alert('你好呀')
      // console.log(window.name)
      let a = document.querySelector('a') 
       //显示错误:ReferenceError: document is not defined
      
      // node中的js的组成:
      // ECMAScript  核心模块  第三方模块
      // 意味着在node环境中运行dom或者bom相关的代码会报错
      let fs = require('fs')
      console.log(fs) //0 1 2 3 4 
      

    5. 运行Node.js程序

    1.REPL:交互解释器

    • Node运行环境的另一种叫法,作用是解析执行js代码
    • 用法
      • 第一种方式:直接双击打开 node.exe,然后写js代码
      • 第二种方式:
        • 先在终端先执行node,进入node环境
        • 然后写js代码

    2.使用终端命令node [js文件路径]开始运行js文件

    • 文件上右键>终端中打开
    • 其实当我们在终端执行Node命令时,并不是我们终端去编译解释js代码,而是电脑会自动打开Node安装包中Node.exe应用程序来打开js文件
      • Node.exe是一个类似于终端的应用程序,没有界面(CLI程序:command-line interface,命令行界面)
      • Node.exe工作环境称之为REPL环境,也就是交互式解释器
    • REPL才是真正解释执行我们js代码的解释器

    3.nodemon

    • 自己决定是否需要使用

    • node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序(自动重启并刷新)

    • 安装: npm install -g nodemon

      • 使用:nodemon [js文件名]

    二.nodejs核心模块

    1.fs文件模块(读写文件)

    fs模块是node提供的核心模块–装好了node就能直接使用这个核心模块
    fs核心模块可以进行文件(目录)的相关操作

    require方法可以引入模块,并返回一个对象,通过返回的对象可以调用模块中提供的api ---- require(‘fs’)

    1.1 readFile读取文件

    readFile(你想读取的文件路径,[选项,如编码],读取之后调用的回调函数)

    // 1.引入你想使用的核心模块
    const myfs = require('fs')
    
    // 2.调用模块中的api进行功能的实现
    // readFile可以以异步的方式读取指定的文件,并对读取结果进行相应的处理,如果文件没有存在则会报错
    // 回调函数:有两个参数 err | data
    // 当读取完成之后,会调用这个回调函数,并将err|data传递给函数的两个参数
    myfs.readFile('./data/a.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log(err)
      } else {
        console.log(data)
      }
    })
    
    myfs.readFile('./data/b.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log(err)
      } else {
        console.log(data)
      }
    })
    // 异步操作的两大特点
    // 1.异步非阻塞:异步操作不会阻塞后面代码的执行
    // 2.异步操作的执行顺序不依赖于异步操作代码的书写顺序
    //就是说返回结果的顺序是不确定的,先执行不一定先返回
    

    读取html页面文件:

    const fs = require('fs')
    
    fs.readFile('./views/login.html', 'utf8', (err, data) => {
      if (err) {
        console.log(err)
      } else {
        console.log(data)
      }
    })
    

    常见错误信息

    1.require('fs'):如果想引入fs,这是固定写法
    
    2.myfs.readfile is not a function:api调用错误了,应该是readFile,注意是小驼峰命名法
    
    3.no such file or directory, open '*****':一定是路径有问题,一定要注意当前需要运行文件的目录,将终端切换到当前目录下再输入命令
    

    1.2 writeFile写入文件

    writeFile:可以将内容写入到文件

    writeFile(文件路径,写入的数据,选项,写入完成之后的回调函数)

    // 1.引入核心模块
    const fs = require('fs')
    
    // 2.调用核心模块的方法实现文件的写入操作
    
    // 特性:
    // 1.默认会覆盖原文件的内容
    // 2.如果指定的源文件不存在,则会先创建再写入
    // 3.如果指定的目录不存在,就真的报错
    fs.writeFile('./data/aa.txt', '写个内容', (err) => {
      if (err) {
        console.log(err)
      } else {
        console.log('ok')
      }
    })
    

    1.3appendFile追加内容

    appendFile:可以往指定的文件中追加内容–不会覆盖原文件的内容

    // 1.引入核心模块
    const fs = require('fs')
    
    fs.appendFile('./data/a.txt', '\r\n再搞个内容', (err) => {
      if (err) {
        console.log(err)
      } else {
        console.log('ok')
      }
    })
    

    2.path路径模块

    2.1 nodejs中的相对路径介绍

    • node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命令的文件夹路径(当前被执行的文件所在的文件夹路径).

      *在服务端开发中,一般不要使用相对路径,而使用绝对路径

    • 解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径

      • __filename:当前js文件所在目录的绝对路径(目录+文件名称)
      • __dirmame:当前js文件的绝对路径(当前文件所在的目录)

    2.2 path路径模块拼接路径

    如果想要获取当前文件夹下其他文件绝对路径,可以使用 __dirname属性来拼接

    使用path模块拼接文件路径与 使用 '+'连接符拼接的好处
    1.会自动帮我们正确添加路径分隔符 ‘/’,我们无需手动添加
    2.当我们路径格式拼接错误的时候,能自动帮我们转换正确的格式

    //1.导入文件模块
    const fs = require('fs');
    
    // console.log(__filename) // 当前文件的全路径:目录+文件名称
    // console.log(__dirname) // 当前文件所在的目录
    
    //......\code./views/login.html
    console.log(__dirname + './views/login.html') 
    //......\code\views\login.html
    console.log(path.join(__dirname, './views/login.html'))
    
    //以后读取文件的时候,一般都会使用绝对路径,通过path.join可以生成规范化的路径
    fs.readFile(path.join(__dirname, '/views/login.html'), 'utf8', (err, data) => {
      if (err) {
        console.log(err)
      } else {
        console.log(data)
      }
    })
    

    三.服务器

    就是提供资源请求响应的电脑
    	a.将资源文件放置到一个我们都能访问的机器上,供我们远程访问--托管资源到服务器
    	b.提供访问的地址,并让资源电脑能够提供资源请求的响应
    	c.如果资源文件更新了,直接更新资源电脑上的文件,而不用每个请求客户端自己来更新
    

    1.什么是服务器

    一个管理资源并为用户提供服务的计算机,通常分为文件服务器(能使用户在其它计算机访问文件,我们平时访问的网页也一个一个的文件),数据库服务器和应用程序服务器;能够提供以上服务的计算机,我们也称其为网络主机(Host)

    2.基本访问流程

    输入主机地址

    指定端口(如果没有指定,则默认为80)

    指定需要访问的资源路径(要参照服务器的设定)

    发起请求

    获取服务器返回的结果并处理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6bjEPSt-1606031839005)(images\requestintro.png)]

    3.具体细节

    为什么我们能够顺利的向服务器发起请求并能够成功的获取到返回结果呢?

    3.1 HTTP协议

    HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准
    客户端和服务器的通信必须遵守某种协议,http协议就是最常见的一种

    • HTTP协议称为超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP),HTTP是万维网的数据通信的基础
    • HTTP协议规范了客户端如何向服务器发送请求以及服务器端如何响应数据回客户端,只有客户端和服务器遵守一个相同的协议,才能建立正常的通信
    • 通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息

    3.2 主机地址(域名)

    • 主机地址是网络中用来唯一标识每台主机或设备的地址,一般使用ip地址进行标识
    • IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,由32位(共四个八位组)的二进制组成,它是一个唯一地址,由于有这种唯一的地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的主机
    • 如果以本机做为服务器,那么本机服务器的IP地址默认就为:127.0.0.1
    • IP地址不好记忆和推广,所以我们使用域名来代码IP地址,方便用户的访问。意味着在访问某一个网站的时候,除了输入熟悉的域名,输入它对应的IP地址也是可以访问的

    3.3 端口

    端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)
    如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多
    参考资料:https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3/103505?fr=aladdin
    
    • 网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机。但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、Web服务等,我们就通过端口号来区别相同计算机所提供的这些不同的服务

    • 客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过端口号,客户端才能真正的访问到该服务器上的某个提供服务的应用软件。为了对端口进行区分,将每个端口进行了编号,这就是端口号

    • 打开cmd后,用“netstat ”查看端口状态,用“netstat -n”命令,以数字格式显示地址和端口信息

    • 常见的端口号

      • 80:web服务器端口
      • 3306:mysql数据服务器端口
    • 结论:为了正确的发送请求和获取响应,我们请求的目标地址应该是IP + 端口的组合,如

      http://157.122.54.189:9063
      

    3.4 资源url地址(接口地址)

    服务器上有很多资源,我们怎么找到我们想要的资源呢?

    • 资源url地址由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
    • 一般情况下,我们向服务器发起请求时,需要准确的告诉服务器我们想要什么,这个时候就有必要传入一个资源url地址了
    • 如http://157.122.54.189:9063/getUserList,这里面的/getUserList就是资源url地址,这个地址对应着服务器端的一个业务处理或者文件地址,例如/getUserList就能够获取存储在服务器的用户列表数据

    3.5 返回数据

    返回数据是指客户端发送请求之后,从服务器端返回的数据

    常见的从服务器返回的数据有:网页结构,样式,图片,js等

    3.5.1 返回状态码

    是用以表示网页服务器超文本传输协议响应状态的3位数字代码

    常见的状态码
    • 200请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态
    • 404:请求失败,请求所希望得到的资源未被在服务器上发现
    • 500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现
    3.5.2 返回数据的格式
    • text/html格式:html代码,浏览器会以html语法解析
    • text/css:样式,浏览器会以css语法解析
    • application/javascript:js代码,浏览器会以js语法解析
    • application/json:json格式字符串,描述从服务器返回的数据

    4.搭建自己的web服务器

    4.1 创建服务器

    1. 服务器一定要遵守http协议,所以首先要引入http协议

    2. 根据http协议创建一个服务器

    3. 添加指定端口的监听

    4. 监听用户的请求 响应

    // 1.服务器一定要遵守http协议,所以首先要引入http协议
    const http = require('http')
    
    // 2.根据http协议创建一个服务器
    // 里面有一个参数,当监听到用户请求的时候,就会调用这个函数来处理,同时给这个函数传入两个参数
    // req:就是客户端传递给服务器的请求数据(请求报文)  -- request,以后与请求相关的操作都通过req来实现
    // res:就是服务器响应给客户端的数据 --response,以后与响应相关的操作都通过res来实现
    const server = http.createServer()
    
    // 3.添加指定端口的监听
    // 127.0.0.1:本机圆环地址,如果以本机做为服务器,默认的地址就是127.0.0.1
    server.listen(3003, () => {
      console.log('http://127.0.0.1:3003')
    })
    
    // 4. 监听用户的请求
    // 当用户向这个服务器发起指定端口的请求时,就会自动的触发request事件
    // 在事件处理函数中,有两个参数:req,res
    // 如果监听到用户的请求,通过设置的资源url用于响应用户特定的请求---路由
    server.on('request', (req, res) => {
      // writeHead设置响应头
      res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
      // res.setHeader('Content-Type', 'text/html;charset=utf-8')
      // 服务器响应回客户端的内容永远都是字符串
      // 但是你需要注意的是,字符串是带格式的
      res.end('为什么写个中文我看不懂aabbcc')
    })
    

    4.2 响应用户登陆页面

    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    // 2.根据http协议创建一个服务器
    // 里面有一个参数,当监听到用户请求的时候,就会调用这个函数来处理,同时给这个函数传入两个参数
    // req:就是客户端传递给服务器的请求数据(请求报文)  -- request,以后与请求相关的操作都通过req来实现
    // res:就是服务器响应给客户端的数据 --response,以后与响应相关的操作都通过res来实现
    const server = http.createServer()
    
    // 3.添加指定端口的监听
    // 127.0.0.1:本机圆环地址,如果以本机做为服务器,默认的地址就是127.0.0.1
    server.listen(3003, () => {
      console.log('http://127.0.0.1:3003')
    })
    
    // 4. 监听用户的请求
    // 当用户向这个服务器发起指定端口的请求时,就会自动的触发request事件
    // 在事件处理函数中,有两个参数:req,res
    // 如果监听到用户的请求,通过设置的资源url用于响应用户特定的请求---路由
    // $().on('click',function(e){})
    server.on('request', (req, res) => {
      // 响应登陆页面
      fs.readFile(path.join(__dirname, '/views/login.html'), (err, data) => {
        if (err) {
          res.end('404')
        } else {
          res.end(data)
        }
      })
    })
    

    4.3 监听客户端请求并响应不同页面

    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    // 2.根据http协议创建一个服务器
    const server = http.createServer()
    
    // 3.添加指定端口的监听
    // 127.0.0.1:本机圆环地址,如果以本机做为服务器,默认的地址就是127.0.0.1
    server.listen(3003, () => {
      console.log('http://127.0.0.1:3003')
    })
    
    // 4. 监听用户的请求
    server.on('request', (req, res) => {
      // 根据用户的请求响应不同的结果
      // 通过req.url可以获取用户请求url,如果没有输入任何值,默认为/
      let myurl = req.url
      console.log(myurl)
      if (myurl == '/login') {
        // 响应登陆页面
        fs.readFile(path.join(__dirname, '/views/login.html'), (err, data) => {
          if (err) {
            res.end('404')
          } else {
            res.end(data)
          }
        })
      } else if (myurl == '/index') {
        // 响应首页
        fs.readFile(path.join(__dirname, '/views/index.html'), (err, data) => {
          if (err) {
            res.end('404')
          } else {
            res.end(data)
          }
        })
      } else if (myurl == '/userlist') {
        // 响应用户数据
        fs.readFile(path.join(__dirname, '/data/user.json'), (err, data) => {
          if (err) {
            res.end('404')
          } else {
            res.end(data)
          }
        })
      }
    })
    

    4.4 响应客户端不同类型的请求

    常用的get请求:

    1.通过超链接发起请求

    2.通过浏览器地址栏发起请求

    3.通过ajax发起请求,同时设置type为get

    4.常见的get操作有:获取数据,详情,搜索

    常见的post请求,一般用于将数据传递到服务器

    1.通过表单的默认行为发起请求,同时将method设置为post

    2.通过ajax发起请求,同时设置type为post

    3.常见的post操作有:新增,编辑,登陆…

    1.通过req.method可以获取当前客户端的请求方式。 根据req.method的值的不同,进行相应的处理操作

    响应get方式的请求

    // 这个服务能够根据用户的请求,响应服务器端的数据到客户端
    // 后台模拟数据,一般使用json文件,之后读取json文件返回数据
    
    // 1.引入http协议
    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    // 2.根据http协议创建服务器,因为服务器要遵守这个协议 
    const server = http.createServer()
    // 3.添加端口的监听
    // 一台电脑可以提供多种不同的服务,通过端口进行区分
    server.listen(3004, () => {
      console.log('http://127.0.0.1:3004')
    })
    
    // 4.监听用户的请求
    server.on('request', (req, res) => {
      // 由于我们是进行后台开发的,所以我们可以制定前端用户的访问规则
      // /getUsers:获取当前所有用户信息
      // 通过req的method属性可以获取当前用户的请求方式
      let mymethod = req.method  // GET或POST
      console.log(mymethod)
      // 获取用户请求的资源url
      let myurl = req.url
      // 判断用户请求的url,进行相应的处理
      if (myurl == '/getUsers' && mymethod == 'GET') {
        fs.readFile(path.join(__dirname, '/data/users.json'), (err, data) => {
          if (err) {
            res.end('err')
          } else {
            res.end(data)
          }
        })
      } else {
        res.end('404')
      }
    })
    

    4.5 根据用户请求方式和请求url实现用户注册功能

    以后服务器有两种类型的文件
    1.在服务器端创建,并且在服务器运行的文件
    2.在服务器端创建,但是是返回到前端浏览器运行的文件  
    

    在这里插入图片描述

    需求:
    1.能够提供用户注册页面
    2.通过接收用户注册请求,并将用户数据存储到服务器的数据文件中
    3.响应注册结果

    用户注册页面
    <body>
      <!-- method:指定请求方式,由于现在我要做注册,说明是将客户端的数据传递给服务器,所以是post请求 -->
      <!-- action:当前表单提交到的目的地址,如果没有设置,默认就是当前页面 -->
      <!--  enctype="application/x-www-form-urlencoded":设置提交数据的编码格式,以后ajax中会看到哦 -->
      <form method="post" action="http://127.0.0.1:3004/register">
        <!-- name属性的作用就是生成参数传递时的键,如果没有键,是不可能生成参数传递的 -->
        <!-- name的属性值不能随意,因为这个参数后期需要在后台进行处理,所以前台页面中的name属性的值一定要参数后台的数据 -->
        姓名: <input type="text" id='name' name='name'> <br>
        年龄: <input type="number" id="age" name='age'> <br>
        <!-- type="submit":submit有默认的提交行为,现在用一用而已,以后避免使用它 -->
        <input type="submit" value="注册">
      </form>
    </body>
    
    服务器的数据文件user.json
    [
     {
      "name": "jack",
      "age": 20
     },
     {
      "name": "rose",
      "age": 18
     }
    ]
    
    // 创建一个服务器,能够实现两个功能
    // 1.响应用户注册页面
    // 2.实现用户注册功能
    
    // 1.引入http协议
    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    const querystring = require('querystring')
    
    // 2.根据http协议创建服务器,因为服务器要遵守这个协议 
    const server = http.createServer()
    // 3.添加端口的监听
    // 一台电脑可以提供多种不同的服务,通过端口进行区分
    server.listen(3004, () => {
      console.log('http://127.0.0.1:3004')
    })
    // 4.监听用户请求
    server.on('request', (req, res) => {
      console.log(__dirname)
      res.setHeader('Content-Type', 'text/html;charset=utf-8')
      // 约定 用户请求方式  和  用户请求url。后台是我们自己写的所以我们可以定制约定,强制规定以后前端请求必须参照我的规定
      // 1.响应用户注册页面: get   /register
      // 2.实现用户注册功能: post  /register
      // 获取请求方式
      let mymethod = req.method
      // 获取用户请求url
      let myurl = req.url
      if (myurl == '/') {
        myurl = '/register'
      }
      // 1.响应用户注册页面
      if (mymethod == 'GET' && myurl == '/register') {
        fs.readFile(path.join(__dirname, '/views/register.html'), (err, data) => {
          if (err) {
            console.log(err)
            res.end('404')
          } else {
            res.end(data)
          }
        })
      }
      // 2.实现用户注册功能
      else if (mymethod == 'POST' && myurl == '/register') {
        // 接收用户参数--重点
        //客户端传递给服务器的参数本质上都是键值对 key=value&key1=value1,接收参数为字符串形式,再转换为对象 {key:value,key1:value1} ,存入json文件中。
        let str = ''
        // 1.node支持大容量的参数传递,它会分批接收参数,接收参数会触发两个事件
        // req.on('data',(chunk)=>{}):每次接收到一部分参数就会触发一次,接收到的chunk是字符串格式
        // req.on('end',()=>{}):当所有参数接收完毕就会触发end事件,在end就可以进行下一步的处理
        req.on('data', (chunk) => {
          // 1.1 拼接参数
          str += chunk
        })
        req.on('end', () => {
          // name=aa&age=20 >> {name:'aa',age:20}
          console.log(str)
          // 1.2 将参数转换为对象
          let obj = querystring.parse(str)
          console.log(obj)
          // 1.3 将对象存储到json文件中
          // 1.3.1 读取json文件 -- 获取字符串
          fs.readFile(path.join(__dirname, '/data/users.json'), 'utf-8', (err, data) => {
            if (err) {
              res.end('注册失败')
            } else {
              // 1.3.2 将字符串转换为js数组
              let arr = JSON.parse(data)
              console.log(arr)
              // 1.3.3 将对象存储到数组
              arr.push(obj)
              // 1.3.4 将数组生成转换为字符串
              // 1.3.5 将字符串重新写入到文件
              fs.writeFile(path.join(__dirname, '/data/users.json'), JSON.stringify(arr, null, ' '), (err1) => {
                // 返回注册结果
                if (err1) {
                  res.end('注册失败')
                } else {
                  res.end('注册成功')
                }
              })
            }
          })
        })
      } else {
        res.end('404')
      }
    })
    

    常见错误

    1.listen EADDRINUSE: address already in use :::3003
    说明当前的3003端口已经被占用了,端口是唯一的,不能重复
    
    2.TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or
     an instance of Buffer. Received an instance of Error
    服务器响应回客户端的数据类型必须是字符串,同时,客户端传递给服务器的也只能是字符串
    
    
    
    展开全文
  • DNS域名解析就是将域名转化为不需要显示端口(二级域名的端口一般为80)的IP地址,域名解析的一般先去本地环境的host文件读取配置,解析成对应的IP地址,根据IP地址访问对应的服务器。若host文件未配置,则会去网络...

    什么是DNS解析域名

    DNS域名解析就是将域名转化为不需要显示端口(二级域名的端口一般为80)的IP地址,域名解析的一般先去本地环境的host文件读取配置,解析成对应的IP地址,根据IP地址访问对应的服务器。若host文件未配置,则会去网络运营商获取对应的IP地址和域名.

    什么是Nginx

    Nginx是一个高级的轻量级的web服务器,由俄罗斯科学家开发的,具有如下优点:

         1.占用内存少,并发量强,支持多种并发连接,效率高.

         2.能够作为负载均衡服务器和(内部直接支持 Rails 和 PHP)代理服务器。Nginx用C编写开销和CPU占有小.

         3.安装启动简单,配置简洁,bug少,一般几个月不需要重新启动且不会宕机,稳定性和安全性好.

    Nginx的作用

    反向代理、负载均衡、配置主备tomcat、动静分离

     

    Nginx 应用场景

    做HTTP服务器、反向代理服务器、静态资源服务器

     

    什么是反向代理

    代替真实服务器接收网络请求,然后将请求转发到真实服务器

     

    反向代理的作用

    隐藏真实服务器,使真实服务器只能通过内网访问,保护了真实服务器不被攻击。配置负载均衡,减轻单台真实服务器的压力。配置主备服务器,保持服务稳定运行。

     

    Nginx如何配置反向代理

    首先到DNS服务器做域名解析,如果是局域网在hosts文件中配置IP和域名对应关系。编辑nginx的nginx.conf文件,配置server_name为指向nginx服务器的域名,location拦截请求,如果是访问nginx本地资源则配置root,如果是反向代理到真实服务器则配置proxy_pass为服务器地址

     

    说说常用Nginx的相关配置

    upstream 负载均衡配置

    server [IP] [weight] [backup] 配置tomcat集群

    proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout 连接时间、真实服务器响应时间、返回结果时间

    location 匹配用户请求的url

    root 配置本地资源路径

    proxy_pass    配置真实服务器地址

     

    请画图展示反向代理流程

     

    LVS与Nginx区别

    LVS是四层反向代理,基于TCP和UDP协议,可用于管理Nginx集群,抗负载能力强。Nginx是七层反向代理,基于HTTP协议,用于管理真实服务器集群。

     

    location的作用

    匹配用户请求url,根据不同请求转发到不同的服务器。

     

    Nginx中如何配置负载均衡

    在upstream中配置多个server,在location的proxy_pass配置为http://+upstream名称

     

    四层负载均衡与七层负载均衡区别

    四层负载均衡基于TCP和UDP协议,通过IP+端口号接受请求并转发到服务器。七层负载均衡基于HTTP协议,通过url或主机名接收请求并转发到服务器。

     

    四层负载均衡有那些实现方案

    LVS、F5

     

    负载均衡有那些算法

    轮询算法:按照时间顺序分配到不同的服务器,当其中一台服务器宕机则被自动剔除,切换到正常的服务器。

    权重算法:按照分配给服务器的权重比例来分发到不同服务器,权重比例越高,则访问几率越大。

    IP绑定(ip_hash):根据访问的IP的哈希结果来判定,使同一个IP访问一台固定的后端服务器,同时解决动态页面的session问题.

     

    服务器分布式后,会产生了那些问题

    分布式锁

    分布式全局ID

    分布式Session一致性问题

    分布式事务

    分布式任务调度

    分布式日志收集

    分布式配置中心

     

    什么是动态负载均衡

    一般情况下,使用nginx搭建服务器集群,每次修改nginx.conf配置文件都需要重启nginx服务器。动态负载均衡就是修改nginx.conf配置文件后不必重启nginx而使配置生效。

     

    Nginx如何实现动态负载均衡

    搭建Nginx+Consul+Upsycn环境。Nginx实现服务的反向代理和负载均衡。Consul是一个开源的注册中心和服务发现的框架,通过HTTP API来发现服务,注册服务。同时支持故障发现,K/V存储,多数据中心,Raft算法等多中高可用特性。Consul在Nginx动态负载均衡作用是

    通过Http api注册和发现服务.Upsycn是新浪微博的开源框架,在Nginx动态负载均衡的作用是Consul的后端的server列表,即获取Nginx的上游服务器(Upstream server)信息,并动态更新Nginx的路由信息.

     

    什么是Http协议

    超文本传输协议

    Http协议组成部分

    Http协议是基于TCP协议封装成超文本传输协议,包括请求(request)和响应(response),http协议请求(request)分为请求参数(request params)和方法类型(request method)、请求头(request hearder)、请求体(request body) ,

    响应(response)分为 响应状态(response state)、响应头(response header)、响应体(response body)等.

     

    TCP与UDP区别

    udp:

       a、是面向无连接, 将数据及源的封装成数据包中,不需要建立连接

        b、每个数据报的大小在限制64k内

        c、因无连接,是不可靠协议

        d、不需要建立连接,速度快

    tcp:

       a、建议连接,形成传输数据的通道.

        b、在连接中进行大数据量传输,以字节流方式

        c、 通过三次握手完成连接,是可靠协议

        d 、必须建立连接效率会稍低

     

    谈谈七层网络模型

    应用层:客户端的各种应用、app;

    表示层:进行数据的格式区分,如图片、编码;

    会话层:本地主机与远程主机的会话管理;

    传输层:定义传输数据的协议端口号,TCP和UDP是这一层的协议;

    网络层:进行逻辑地址寻址;

    数据链路层:建立逻辑连接,进行硬件地址寻址;

    物理层:建立物理连接;

     

    Nginx如何实现TCP四层负载均衡

    在nginx.conf文件中配置tcp模块,在upstream块中定义socket服务器负载均衡,其余与nginx配置七层负载均衡相同。

    tcp {

       ### 定义多个上游服务器

       upstream  itmayeidu{

          ### 定义TCP模块上游服务器

          server 192.168.5.165:80001;

      server 192.168.5.165:80002;

       }

        server {

            listen       9999;

            server_name  192.168.212.137;

    ### 反向代理upstream

            proxy_pass itmayeidu;

        }

    }

     

    lvs 与Nginx 区别

    lvs工作在网络第四层,nginx工作在网络第七层;lvs比nginx抗负载能力强;lvs对网络依赖性强,nginx对网络依赖性弱;lvs几乎可以对所有应用做负载均衡,比如数据库。

     

    lvs与keepalived区别

    Lvs可以实现负载均衡,但是无法实现健康检查。Keepalived可以进行健康检查实现高可用。

     

    keepalived 作用

    keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题

     

    如何实现双机主从热备

    Nginx+Tomcat:在upstream中配置多台服务器,从服务器后加backup

    Keepalived+Nginx:在多台nginx服务器上安装keepalived,将主服务器的state设置为MASTER,从服务器设置为BACKUP,主服务器的优先级要高于从服务器

     

    lvs+Keepalived+Nginx架构流程图

     

    项目发布如何不影响到正常用户访问,实现7*24小时访问

    可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性,从而保证服务器7*24小时运行。

     

    项目如何发生故障宕机了,如何处理。

    使用lvs+keepalived+Nginx做主从热备,lvs管理nginx集群,nginx管理服务器集群,在服务器宕机的情况下keepalived启动健康检测,多次重启无果可以短信通知运维人员及时维护。

     

    动态网站与静态网站区别

    在浏览器中打开一个网站,点击鼠标右键查看源码,多次请求后如果源码不产生变化就是静态网站,变化就是动态网站。

     

    动态页面静态化的作用

    便于搜索引擎抓取和排名

     

    什么是动静分离架构模式

    静态页面与动态页面分开不同系统访问的架构设计方法,静态页面与动态页面以不同域名区分。

     

    如何搭建动静分离

    以nginx服务器作为静态资源服务器,静态资源和动态资源访问分开配置,静态资源在location中使用本地文件路径配置方式,动态资源使用proxy_pass配置到后台服务器。

    如:

        ###静态资源访问

        server {

          listen       80;

          server_name  static.itmayiedu.com;

          location /static/imgs {

               root F:/;

               index  index.html index.htm;

           }

        }

       ###动态资源访问

     server {

          listen       80;

          server_name  www.itmayiedu.com;

     

          location / {

             proxy_pass http://127.0.0.1:8080;

             index  index.html index.htm;

           }

        }

     

    动静分离与前后分离区别

    动静分离是将静态资源和动态资源存放在不同服务器中,前后分离是将前端和后台分离,前端通过api调用后台接口

     

    如何控制浏览器静态资源缓存

    静态资源存在缓存的原因是项目上线时,浏览器缓存中的静态资源导致与服务器将淘汰资源的代码发生冲突(或者是页面访问频繁访问同一资源,导致一些浏览器如IE(本人开发亲身经历过)返回默认的响应结果,与实际响应结果不符合),

    一般的服务器是强制F5进行刷新或者是清除缓存,最有效的解决方法就是在请求资源后面加上变量(如时间戳,随机数)

     

    Http状态码304的作用

    表示浏览器存在静态资源缓存就不从服务器获取静态资源

    展开全文
  • loadrunner常见问题整理

    千次阅读 2015-02-02 11:55:50
    1.LR 脚本为空的解决方法: ...有可能是由于录制的URL地址采用的是localhost的问题,改成分配的IP地址或127.0.0.1试试。 3、插入文本检查点步骤时,使用web_reg_find,通常TextPfx和TextSfx中会包含双引号,需

    1.LR 脚本为空的解决方法:

    1.去掉ie设置中的第三方支持取消掉

    2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen.exe文件.

    有可能是由于录制的URL地址采用的是localhost的问题,改成分配的IP地址或127.0.0.1试试。

    3、插入文本检查点步骤时,使用web_reg_find,通常TextPfx和TextSfx中会包含双引号,需要进行转义(用斜杠),例如:

    web_reg_find("Search=Body",

    "SaveCount=Welcome",

    "TextPfx=欢迎<a class=\"drop\" id=\"viewpro\" onMouseOver=\"showMenu(this.id)\">",

    "TextSfx=</a>",

    LAST)

     遇到flight界面为空的解决的可能方法:

    1、如果安装了IE以外的浏览器,并且IE不是默认浏览器,则无法生成录制脚本

    2、如果录制脚本时IE不能打开,则需要将浏览器的IE工具高级选项中,将“启用第三方浏览器扩展”的

    勾选去掉

    3、lr自带的webtours系统,如果点击Flights选项,出现空白页面,请检查本机oracle的 PERL5LIB环境

    2.LoadRunner录制脚本时为什么不弹出IE浏览器?

      当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。

      启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题

      提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。

             录制脚本前的路径填写正确


    3.HTML-based scriptURL-based script的脚本有什么区别?

    使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;

    使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。

      通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。

    4.运行时的Pacing设置主要影响什么?

      Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:A:上次迭代结束后立刻开始、 B:上次迭代结束后等待固定时间、C:按固定或随机的时间间隔开始执行新的迭代。

     根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。

       5.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗?

      Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。

       6.VuGen支持Netscape的客户证书吗?

      不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。

       7.VuGen会修改录制浏览器中的代理服务器设置吗?

      会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。

      8.LoadRunner脚本如何输出当前系统时间?

      LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。

      调用语句与返回值如下示例:

      typedef long time_t;

      Action()

      {

      time_t t;

      lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));

      lr_message(“System time and date: %s”,ctime(&t));

      }

      输出结果为:

      Time in seconds since 1/1/70: 1185329968

      System time and date:Wed Jul 25 10:19:28 2007

      9.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?

      这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。

      由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,则用户登录信息将一并清除,因此迭代时可能会发生错误。

      10.虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?

      如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。

      另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。

      11.Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?

      这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。

      进入“Run-time Setting”对话框后,依次进入“Internet Protocol→Preference”。然后点击“Options…”按钮,进入高级设置对话框,可以修改各类超时设置的默认值。

      13为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去-27796?

       在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。

       (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。

      (2)找到Windows关键字,Windows关键字如下所示:

      %SystemRoot%\system32\csrss.exe bjectDirectory=\Windows

      SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1

      ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2

      ProfileControl=Off MaxRequestThreads=16

      SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。

       (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。

    通过对注册表的更改,系统将允许运行更多的线程,因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。

    14.Error -27728: Step download timeout (120 seconds)的解决方法

    loadruner报错:Error -27728: Step download timeout (120 seconds)如何解决语法检查通过,但是在并发执行一个查询时候报错Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s), 请问有啥子解决方法,我使用web_set_timeout ,好象不起作用,直接在option中设置timeout时间为600,(单位应该是秒吧)还是没有起作用,结果都还是提示(120seconds),说明还是以120秒来判断的;使用lrs_set_recv_timeout,语法检查不过,说明库函数里面没有这个函数。尝试步骤:设置超时时间到600秒,回放还是出错。后来我设置了runt time setting中的internet protocol-preferences中的advaced区域有一个winlnet replay instead of sockets选项,选项后再回放就成功了。

    首先LR是通过Microsoft WinInet DLL去录制web协议的!但是在Control运行的时候它默认通过socket去模拟请求,因为这些可以真实的模拟带宽,而采用Microsoft WinInet DLL通过这个DLL去访问网卡方式去模拟带宽,使得模拟不是很精确!而且也不支持unix的应用,但是使用这个确实有时无法处理winnet Dll的一些请求,我认为是它的一些BUG,比如说:回放时它会检查Content-Length,但是网页支持receive more data时,这时socket模拟会一直等待直到timeout!先说了一些优缺点,最后回到这个问题!这个问题分两个方面分析:

    第一:你要明白web_set_timeout()这个函数的适用范围!比如说一个web_submit_data()中实际涵盖了10个对Server 端的请求,这个函数是针对10个请求的总和时间的!(别犯低级错误,timeout分了connect,receive以及download三个部分:) ) 第二:就是我解释的上面的一些BUG问题!WinInet dll在新版本中处理请求时可以异步的,就是不再是那种连接等待然后超时模式!但是LR用的socket是同步请求!只有等到timeout才会退出!microsoft已经明确表示INTERNET_OPTION_RECEIVE_TIMEOUT 不再适用于 Microsoft Internet Explorer 5.0,显而易见,他们处理请求采取了异步处理的方式!呵呵!这下大概可以圆满解释你的问题了!呵呵这里,

    我补充如下:VuGen专用的基于套接字的重播是一种可伸缩以便进行负载测试的轻型引擎。使用线程时是准确的。基于套接字的引擎不支持socks代理服务器。如果在这样的环境中录制,应该使用winInet重播引擎。

    15.性能测试往往需要准备大批量的数据,大批量数据的生成方法有很多种,常见的有:

    (1)编写SQL语句来插入数据

    (2)使用DataFactory等专业的数据生成工具

    (3)通过LoadRunner录制回放的方式重复执行生成大批量数据

    Tips:

    使用DataFactory插入nchar数据类型的数据时会出现空值的情况,可以先修改数据库的数据类型设置,插完数据后再改回来

    16.录制脚本中包含中文,出现乱码怎么办?

    把录制选项中的Support charset选中UTF-8

    录制脚本后,切换到树视图中,打开相应的脚本页面。在右侧的PageView中录制的脚本呈现中文版式,但是当切换到Server Response中,所有的中文全部换成的乱码,如“勌缞仫訆”。

    原因是服务器端没有把响应的编码设置为gb2312

    在IIS中找到Web.Config文件,在<system.web>….</system.web>节加入<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312"/>后再次录制脚本,乱码变中文。

    17.LoadRunner回放脚本时,在浏览器显示的中文是乱码

    解决办法(1):

    首先设置Run-Time Settings – Browser – Browser Emulation – User-Agent

    然后设置IE

    查看-编码-钩上“自动选择”和Unicode(UTF-8)。

    解决办法(2):

    使用lr_convert_string_encoding函数来转换编码

    下面是一个使用的例子:

    lr_convert_string_encoding(lr_eval_string("{ReplyContents}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"ReplyMessage");

    web_submit_data("postreply.aspx_2",

    "Action=http://127.0.0.1/postreply.aspx?infloat=1&topicid=2&&inajax=1",

    "Method=POST",

    "EncType=multipart/form-data",

    "RecContentType=text/xml",

    "Referer=http://127.0.0.1/showtopic-2.aspx",

    "Snapshot=t9.inf",

    "Mode=HTML",

    ITEMDATA,

    "Name=iconid", "Value=0", ENDITEM,

    "Name=title", "Value=", ENDITEM,

    "Name=wysiwyg", "Value=0", ENDITEM,

    "Name=checkbox", "Value=0", ENDITEM,

    "Name=message", "Value=[localimg=180,112]1[/localimg]\r\n\r\n{ReplyMessage}", ENDITEM,

    "Name=e_mediatyperadio", "Value=on", ENDITEM,

    "Name=sl_attachdesc", "Value=", ENDITEM,

    "Name=attachid", "Value=", ENDITEM,

    "Name=attachdesc", "Value=", ENDITEM,

    "Name=localid", "Value=", ENDITEM,

    "Name=attachdesc", "Value=", ENDITEM,

    "Name=localid", "Value=1", ENDITEM,

    "Name=attachdesc", "Value=", ENDITEM,

    "Name=localid", "Value=2", ENDITEM,

    "Name=emailnotify", "Value=on", ENDITEM,

    "Name=postreplynotice", "Value=on", ENDITEM,

    "Name=postfile", "Value=", "File=Yes", ENDITEM,

    "Name=postfile", "Value=D:\\\\图片收集\\\\It's about time.JPG", "File=Yes", ENDITEM,

    "Name=postfile", "Value=", "File=Yes", ENDITEM,

    "Name=uploadallowmax", "Value=10", ENDITEM,

    "Name=uploadallowtype", "Value=jpg,gif", ENDITEM,

    "Name=thumbwidth", "Value=300", ENDITEM,

    "Name=thumbheight", "Value=250", ENDITEM,

    "Name=noinsert", "Value=0", ENDITEM,

    LAST);

    18.可以在LR测试脚本的目录中找到参数文件,直接修改参数文件

    The parameter file is stored in the script directory as .dat file extension. It can be opened with a simple text editor like Notepad as it is stored in pure text format. Therefore, you can manipulate the files via the Notepad. You can also use office applications such as Microsoft Excel or OpenOffice.org Calc to work on the file. This greatly the amount of work required for maintaining a long list of data.

    19.LR9.x启动VUGen时提示"Failed to connect to server"

    After upgrading to LoadRunner 9.x I started getting a window popup which said "Failed to connect to server" every time I opened virtual user generator (vugen.exe).

    The solution to this was to close virtual user generator and delete the [vugen.ini] file.

    vugen.ini is found in the %systemroot% folder on your Windows PC (usually C:\WINDOWS or C:\WINNT).

    Once you've deleted the file, virtual user generator will open without any issues and create a new vugen.ini file automatically.

    20.怎样抓取有相同左右边界的动态value

    怎样抓取有相同左右边界的动态value?例如:

    stateID="d7lg0ehmjkkm6uin3s4boei7oq">

    stateID="cvopakp46ftsf8mh6l37ti3ubm">

    stateID="bv9mja8gtgr39ddibm5t9163re">

    web_reg_save_param里的ORD应该怎样设置?

    ORD: Indicates the ordinal position or instance of the match. The default instance is 1. If you specify "All," it saves the parameter values in an array.

    例子:

    char outFlightParam[50]; // The name of the parameter for correlation

    char outFlightParamVal[50]; // The formatted value of outFlightParam

    web_reg_save_param("outFlightVal",

    "LB=outboundFlight value=", "RB=>",

    "ORD=ALL",

    "SaveLen=18",

    LAST);

    web_submit_form("reservations.pl",

    "Snapshot=t4.inf",

    ITEMDATA,

    "Name=depart", "Value=London", ENDITEM,

    "Name=departDate", "Value=11/20/2003", ENDITEM,

    "Name=arrive", "Value=New York", ENDITEM,

    "Name=returnDate", "Value=11/21/2003", ENDITEM,

    "Name=numPassengers", "Value=1", ENDITEM,

    "Name=roundtrip", "Value=<OFF>", ENDITEM,

    "Name=seatPref", "Value=None", ENDITEM,

    "Name=seatType", "Value=Coach", ENDITEM,

    "Name=findFlights.x", "Value=83", ENDITEM,

    "Name=findFlights.y", "Value=16", ENDITEM,

    LAST);

    sprintf(outFlightParam, "{outFlightVal_%s}",

    lr_eval_string("{outFlightVal_count}"));

    sprintf(outFlightParamVal, "Value=%s",

    lr_eval_string(outFlightParam));

    lr_message("The value argument is : %s", outFlightParamVal);

    web_submit_form("reservations.pl_2",

    "Snapshot=t5.inf",

    ITEMDATA,

    "Name=outboundFlight",outFlightParamVal, ENDITEM,

    "Name=reserveFlights.x", "Value=92", ENDITEM,

    "Name=reserveFlights.y", "Value=10", ENDITEM,

    LAST);

    21.运行场景时提示“Step download timeout (120 seconds) has expired when downloading resource(s)

    vuser_init.c(12): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)(出现个别,可以忽略)

    vuser_init.c(12): Error -27727: Step download timeout (120 seconds) has expired when downloading resource(s). Set the "Step Timeout caused by resources is a warning" Run-Time Setting to Yes/No to have this message as a warning/error, respectively

    vuser_init.c(12): Error -27796

    如果觉得下载一个页面超过2分钟不是错误的话,可以在Run-Time设置中选择Preferences->Options,修改Step download timeout(sec)的时间

    或者把“Step timeout caused by resources is a warning”设置为Yes,这样下载资源超时也只是作为警告,不作为错误提示,但是对于非资源的下载超时,则总是会提示错误的

    22.strtok函数分割字符串

    需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数。

    //Body response 内容: <BODY><; PRE>//OK[8,7,5,15,6,5,0,4,0,3,0,3,2,0,0,0,1

    用web_reg_save_param取出“8,7,5,15,6,5,0,4,0,3,0,3,2,0,0,0,1”这一段,然后用strtok函数切割出一个个数字,第四个数字就是要找的值

    例如:

    extern char * strtok(char * string, const char * delimiters ); // Explicit declaration

    char separators[] = ",";

    char * token;

    lr_save_string("1,2,3,4,5,6","str");

    token = (char *)strtok(lr_eval_string("{str}"), separators); // Get the first token

    if (!token) {

    lr_output_message ("No tokens found in string!");

    return( -1 );

    }

    while (token != NULL ) { // While valid tokens are returned

    lr_output_message ("%s", token );

    token = (char *)strtok(NULL, separators); // Get the next token

    }

    23.LoadRunner没有购买webservice协议的license,只有http的,可不可以完全用http协议模拟webservice

    可以,参考:

    http://blog.testsautomation.com/2009/01/web-services-performance-using-loadrunner/

    http://blog.testsautomation.com/2009/05/validating-web-service-response-with-xpath/

    24.在场景设置中不忽略思考时间,但是在查看响应时间的时候怎样让LR自动在响应时间里减去思考时间?

    在analysis中找到了设置是否在报告中包含思考时间的地方做相应的设置即可:

    25.LoadRunner在运行过程中停掉1半虚拟用户

    Another issue that I’m facing from time to time is that LoadRunner stops 50% of running users without any notification, issue, error message etc. I’ve find out that it happens only when running with log level set to ‘always send a message’. Because of that, I suggest to run with log level set to ‘Send message only when error occur’.

    26.测试RTMP协议应该在LoadRunner选择什么协议来录制?

    用flex协议

    有这几个函数可用:

    flex_rtmp_connect Connects a client to an RTMP server and sets connection options.

    flex_rtmp_disconnect Disconnects a client from an RTMP server.

    flex_rtmp_send Sends messages to an RTMP server.

    flex_rtmp_receive Receives responses from an RTMP server

    Flex can record and replay scripts involving RTMP (Real Time Messaging Protocol). In order to enable RTMP simulation, you must configure the recording options for the Flex protocol.

    To enable RTMP:

    1 Open the Recording Options dialog box by selecting Tools > Recording Options or clicking the Options button in the Start Recording dialog box.

    2 In the Network > Port Mapping node click Options.

    3 Set the Send-Receive buffer size threshold to 1500.

    27.如何在LoadRunner中运行QTP脚本?

      1、运行准备:

    1)勾选QTP的Tools--Options--Run的"Alow other Mercury products to run tests and components"

    2)录制需要在lr中运行的QTP脚本,并且在QTP脚本中设置事务,Services.StartTransaction "start"与Services.EndTransaction "start"

    2、运行QTP脚本

    在LR中运行时选择QTP脚本,为QTP脚本存放目录下文件扩展名为.usr的文件。

     注:LR中运行QTP脚本时,只能有一个Vuser,否则将报错:

      The load generator is currently running the maximum number of Vusers of this type

    28.LR中如何忽略Socket接收数据的验证

    在LR中对Socket进行性能测试时,LR会自己判断lrs_receive回来的数据的长度,而如果长度不符的话会有时间延迟的情况(这是性能测试完全不能接受的事情),如果做到这一点呢,经过反复尝试,发现一种简单的方法(用*代替具体的长度):

    类似于将:

    recv buf1 12

    "Hello, Denny"

    改为:

    recv buf1 *

    "Hello, Denny"

    一切OK

    29.LoadRunner9.5Controller中不能添加Apache的监控

    在C:\Program Files\HP\LoadRunner\dat\online_graphs中找到online_resource_graphs.rmd文件,修改[Apache]部分中的EnableInUI为1

    参考:

    http://forums11.itrc.hp.com/service/forums/questionanswer.do?admit=109447626+1274450165814+28353475&threadId=1229523

    30.VB Vuser开发ADO脚本,提示“user-defined type not defined

    想在VB Vuser写入模拟数据操作的过程,然后在VB Vuser里定义了这个全局变量

    Private m_Conn As ADODB.Connection '连接对象

    Private m_Reco As ADODB.Recordset'结果集

    但是在VB Vuser中不识别这个对象,报出user-defined type not defined

    需要在Run-Time 设置中的VBA部分把ADO的库选上

    如果用VB Script虚拟用户来开发就不要,直接用CreateObject来创建ADO对象即可

    31.loadrunner9.5录制脚本时出现c:\PROGRA~1\MICROS~1\office12\Grooveutil.DLL时出错内存位置访问无效

    Office2007的问题,IE加载项禁用Groove GFSBrowser Helper 组件

    32.LR自带的例子端口号怎么修改?

    LR自带的例子端口号是1080,我怎么样把这个端口设置我自己想用的端口号8088,在什么地方设置在LR安装目录下,找到Xitami.config文件,找到portbase,可以修改它(默认是1000);

    默认的端口号是portbase+80;要把端口号改成8088,就把portionbase改为8008,保存之后就是了(8088=8008+80)。

    33.Web_reg_find查找中文字符串时查找不到

    脚本文件里有个default.cfg,里面有个参数是 UTF8InputOutput ,将其值改为0

    34.替代IP Wizard的脚本

    http://hi.baidu.com/higkoo/blog/item/39bbb21bc33d76dcac6e751c.html

    LoadRunner自带的“IP Wizard”用起来非常麻烦,要不停的点,重要的是最后还必须重启系统生效。

    于是乎写个脚本替代之:

    1. 假设客户端IP为 192.168.10.31

    2. 假设服务端IP为 192.168.10.10

    3. 需要模拟的IP为 110.119.120.122

    那么,客户端提供添加虚拟IP的BAT脚本:

    netsh interface ip add address本地连接110.119.120.122 255.255.0.0

    对应的删除设置为:

    netsh interface ip del address本地连接110.119.120.122

    对应服务器添加虚拟路由的Shell脚本:

    route add -host 110.119.120.122 gw 192.168.10.31

    删除路由的脚本:

    route del -host 110.119.120.122 gw 192.168.10.31

    这样就非常方便了,不用重启任何机器,执行脚本就生效,再执行脚本就取消。

    35.如何从命令行调用LoadRunner脚本?

    Here is the command line that you need to execute to run a VuGen script from the command prompt:

    <LoadRunner>\bin\mmdrv.exe -usr <path to usr file>

    Note:

    In order to get all the other options that go with the command, run mmdrv.exe from the command prompt without any options.

    36.请问"int64这个类型,LR中怎么表示"。我将一段C的代码放在LR,LR不认int64这个类型,怎么解决?

    把那段C代码做成DLL,然后在LR中调用

    37.LoadRunner监控远程机器Windows资源,提示“net use failed

    解决办法:

    在被监控机器上更改本地帐户的共享和安全模式为经典模式。控制面板->管理工具->本地安全策略->网络访问:本地帐户的共享和安全模式->经典模式。

    监视连接前的准备工作:

    首先保证被监视的windows系统开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Service

    被监视的WINDOWS机器:右击我的电脑,选择管理->共享文件夹->共享 在这里面要有C$这个共享文件夹,(要是没有自己手动加)

    然后保证在安装LR的机器上使用运行.输入\\被监视机器IP\C$ 然后输入管理员帐号和密码,如果能看到被监视机器的C盘了,就说明你得到了那台机器的管理员权限,可以使用LR去连接了

      38.LoadRunner脚本中出现乱码问题现象某个链接或者图片名称为中文乱码,脚本运行无法通过。


      错误分析
      脚本录制可能采用的是URL-based script方式,如果程序定义的字符集合采用的是国际标准,脚本就会出现乱码现象。
      解决办法重新录制脚本,在录制脚本前,打开录制选项配置对话框进行设置,在“Recording Options”的“Advanced”选项里先将“Surport Charset”选中,然后选中支持“UTF-8”的选项。

    39.LoadRunner不执行检查方法错误现象在脚本中插入函数Web_find,在脚本中设置文本以及图像的检查点,但是在回放过程中并没有对设置的检查点进行检查,即Web_find失效。


      错误分析
      由于检查功能会消耗一定的资源,因此LoadRunner默认关闭了对文本以及图像的数据执行保护检查,所以在设置检查点后,需要开启检查功能。
      解决办法打开运行环境设置对话框进行设置,在“Run-time Settings”的“Internet Protocol”选项里的“Perference”中勾选“Check”下的“Enable Image and text check”选项。
      需要注意的是,回放脚本时出现的错误有时是程序自身的原因导致的,因此在解决脚本回放问题前必须保证程序录制出的脚本是正确的。

      40.LoadRunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同。

      错误现象1:Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)。

      错误分析:对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner中修改),客户端发送一个请求到服务器端,如果超过120秒服务器端还没有返回结果,则出现超时错误。

    解决办法:首先在运行环境中对超时进行设置,默认的超时时间可以设置长一些,再设置多次迭代运行,如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功。

      错误现象 2:Action.c(81):Continuing after Error -27498: Timed out while processing URL=http://172.18.20.70:7001/workflow/bjtel/leasedline/ querystat/ subOrderQuery.do

      错误分析:这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。

      如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置。

      解决办法:例如上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。分析一下服务器,最好对其性能进行优化。

    如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。

      最后,增加一下运行时的超时设置,在“Run-Time Settings”>“Internet Protocol:Preferences”中,单击“options”,增加“HTTP-request connect timeout” 或者“HTTP-request receive”的值。

      41.LoadRunner脚本中出现乱码:在录制Web协议脚本时出现中文乱码,在回放脚本时会使回放停止在乱码位置,脚本无法运行。

      错误现象:某个链接或者图片名称为中文乱码,脚本运行无法通过。

      错误分析:脚本录制可能采用的是URL-based script方式,如果程序定义的字符集合采用的是国际标准,脚本就会出现乱码现象。

      解决办法:重新录制脚本,在录制脚本前,打开录制选项配置对话框进行设置,在“Recording Options”的“Advanced”选项里先将“Surport Charset”选中,然后选中支持“UTF-8”的选项。

      42.LoadRunner HTTP服务器状态代码:在录制Web协议脚本回放脚本的过程中,会出现HTTP服务器状态代码,例如常见的页面-404错误提示、-500错误提示。

      错误现象1:-404 Not Found服务器没有找到与请求URI相符的资源,但还可以继续运行直到结束。

      错误分析:此处与请求URI相符的资源在录制脚本时已经被提交过一次,回放时不可再重复提交同样的资源,而需要更改提交资源的内容,每次回放一次脚本都要改变提交的数据,保证模拟实际环境,造成一定的负载压力。

    解决办法:在出现错误的位置进行脚本关联,在必要时插入相应的函数。

      错误现象2:-500 Internal Server Error服务器内部错误,脚本运行停止。

      错误分析:服务器碰到了意外情况,使其无法继续回应请求。

      解决办法:出现此错误是致命的,说明问题很严重,需要从问题的出现位置进行检查,此时需要此程序的开发人员配合来解决,而且产生的原因根据实际情况来定,测试人员无法单独解决问题,而且应该尽快解决,以便于后面的测试。

      43.LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止。

      错误现象:Action.c(41): Error -27979: Requested form. not found [MsgId: MERR-27979]

      Action.c(41): web_submit_form. highest severity level was "ERROR",0 body bytes, 0 header bytes [MsgId: MMSG-27178]"

      这时在tree view中看不到此组件的相关URL。

    错误分析:所选择的录制脚本模式不正确,通常情况下,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用HTTPS安全协议,这时则使用“URL-based script”模式进行录制。

      解决办法:打开录制选项配置对话框进行设置,在“Recording Options”的“Internet Protocol”选项里的“Recording”中选择“Recording Level”为“HTML-based script”,单击“HTML Advanced”,选择“Script. Type”为“A script. containing explicit”。然后再选择使用“URL-based script”模式来录制脚本。

      44LoadRunner不执行检查方法:在录制Web协议脚本中添加了检查方法Web_find,但是在脚本回放的过程中并没有执行。

      错误现象:在脚本中插入函数Web_find,在脚本中设置文本以及图像的检查点,但是在回放过程中并没有对设置的检查点进行检查,即Web_find失效。

      错误分析:由于检查功能会消耗一定的资源,因此LoadRunner默认关闭了对文本以及图像的检查,所以在设置检查点后,需要开启检查功能。

    解决办法:打开运行环境设置对话框进行设置,在“Run-time Settings”的“Internet Protocol”选项里的“Perference”中勾选“Check”下的“Enable Image and text check”选项。

      45.LoadRunner回放Web Services协议脚本错误:LoadRunner 8.0版本在录制Web Services协议的脚本时正常,但在回放时会出现错误,提示停止脚本运行。

      错误现象:利用LoadRunner 8.0版本来录制Web Services协议的脚本没有任何错误提示,回放脚本时会出现如下错误提示“Error:server returned an incorrectly formatted SOAP response”。

      错误分析:出现此错误的原因是LoadRunner8.0在录制Web Services协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为<?xml version="1.0"encoding="zh_cn" ?>,所以才会有此错误提示。

    解决办法:下载两个补丁,分别为“LR80WebServicesFPI_setup.exe”和“lrunner_web_ services_patch_1.exe”安装上即可。

    46.LR启动controller报错“transaction monitor not available

    1.多是OS系统问题,修复试试或升级

    2.或修复LR试试

    47.Loadrunnber报错误:Error -- memory violation : Exception ACCESS_VIOLATION received.的一种情况

    Posted on 2011-01-05 12:12蝈蝈俊 阅读(433)评论(0) 编辑收藏

    最近写的一个Loadrunner脚本,最后一步是点击“退出”按钮退出登录状态,如下:

    web_text_link("[退出]",

    "Snapshot=t18.inf",

    DESCRIPTION,

    "Text=[退出]",

    ACTION,

    "UserAction=Click",

    LAST);

    return 0;

    但是会报错误:

    Action1.c(94): Error: C interpreter run time error: Action1.c (94):Error -- memory violation : Exception ACCESS_VIOLATION received.

    Action1.c(94): Notify: CCI trace: Action1.c(94): web_text_link(0x02080870, 0x0208085f "Snapshot=t18.inf", 0x02080a42 "DESCRIPTION", 0x02080853, 0x02080a3b "ACTION", 0x020809de "UserAction=Click", 0x02080a6a "LAST")

    Action1.c(94): Notify: CCI trace: Compiled_code(0): Action1()

    经过试验,发现是因为 退出后有个自动跳转。

    如果退出结束代码修改为下面就没有问题了。

    web_text_link("[退出]",

    "Snapshot=t18.inf",

    DESCRIPTION,

    "Text=[退出]",

    ACTION,

    "UserAction=Click",

    LAST);

    web_browser("Sync",

    "Snapshot=t18.inf",

    DESCRIPTION,

    ACTION,

    "Sync",

    LAST);

    return 0;

    结论:

    web_text_link如果有中间跳转,不能放在代码的最后,最后要有一个 Sync

    48.Step download timeout(sec)设置

    这个默认是120秒,但是经常我们要设置的更大一些,具体设置方法:Vugen--Vuser---Runtime-settings----Preferences------option,将Step download timeout(sec)默认值120s改为自己需要的值,其次要改变HTTP-reguest connnect timeoutsec)和HTTP-reguest receive timeoutsec)也为相应的值。

    49.修改本机tcp连接数

    因为个人pc机的默认的tcp连接数只有15个(xp),所以我们在模拟虚拟多个用户时,就会遇到tcp的连接限制,从而报错。修改的方法:windows下运行Patch.exe
    输入C,再输入你要的TCP/IP连接数字(一般为5002000)回车确认
    输入Y 回车确认。
    倒计时15秒后结束。
    接着再运行下Patch.exe,看连接数是不是由原来的10变成自己改了的数值。
    Patch.exe
    下载地址:http://www.touchboy.cn/2007/05/% ... %E6%8E%A5%E6%95%B0/

    50.关于Error -27791: Error -27790:Error -27740:错误的解决方法:

    错误如下:
    Action.c(198): Error -27791: Server "www.zcpx.cn" has shut down the connection prematurely
    Action.c(198): Error -27790: Failed to read data from server "www.zcpx.cn": [10053] Software caused connection
    abort
    Action.c(198): Error -27740: Overlapped transmission of request to "www.zcpx.cn" for URL

    "http://www.zcpx.cn/userEntry.do" failed: WSA_IO_PENDING

    解决办法:
    在脚本的最前面加上web_set_sockets_option("OVERLAPPED","0");

    51. LR中错误代号为27796的一个解决方法

    错误如下:

    52.

    1A:注册表不能访问或写导致的,可以恢复注册表或卸载(清除注册表,可以使用工具)重新安装程序。
    要启支LR自带的实例的服务时,出错了,提示:端口已经被另一个服务占用,请问一下能不能自己修改这个程序原来设定的端口啊?
    2A:停止服务之后,在程序的安装目录\WebTours下找到xitami.cfg文件修改portbase值,注意 默认的端口号是portbase+80,portbase值是1000;要把端口号改成8088,就把portbase改为8008,保存之后就是了(8088=8008+80)。然后重启服务

    二:LoadRunner面试(笔试)问题整理

    1. 什么是负载测试?什么是性能测试?

    负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下,系统所能承受的最大负载量的测试,例如,访问一个页面的响应时间规定不超过1秒,负载测试就是测试在响应时间为1秒时,系统所能承受的最大并发访问用户的数量。

    压力测试通常是在高负载情况下来对系统的稳定性进行测试,更有效地发现系统稳定性的隐患和系统在负载峰值的条件下功能隐患等。

    性能测试:指在一定的约束条件下(指定的软件、硬件、网络环境等),确定系统所能承受的最大负载压力。

    2. 性能测试包含了哪些测试(至少举出3种)

     性能测试包含负载测试、压力测试、大数据量测试、疲劳强度测试等。

    3. 简述性能测试的步骤

     第一,分析产品结构,明确性能测试的需求,包括并发、极限、配置和指标等方面的性能要求,必要时基于LOAD测试的相同测略需同时考虑稳定性测试的需求。
      第二,分析应用场景和用户数据,细分用户行为和相关的数据流,确定测试点或测试接口,列示系统接口的可能瓶颈,一般是先主干接口再支线接口,并完成初步的测试用例设计。
      第三,依据性能测试需求和确定的测试点进行测试组网设计,并明确不同组网方案的重要程度或优先级作为取舍评估的依据,必要时在前期产品设计中提出支持性能测试的可测试性设计方案和对测试工具的需求。
      第四,完成性能测试用例设计、分类选择和依据用户行为分析设计测试规程,并准备好测试用例将用到的测试数据。
        第五,确定采用的测试工具。
          第六,进行初验测试,以主干接口的可用性为主,根据测试结果分析性能瓶颈,通过迭代保证基本的指标等测试的环境。
          第七,迭代进行全面的性能测试,完成计划中的性能测试用例的执行。
          第八,完成性能测试评估报告。
      在进行性能测试的时候,我们需要知道一些有效的性能指标,下面我们来列出一些主要的性能指标:
      一是,通用指标(指Web应用服务器、数据库服务器必需测试项):
          *ProcessorTime:指服务器CPU占用率,一般平均达到70%时,服务就接近饱和;
          *Memory Available Mbyte:可用内存数,如果测试时发现内存有变化情况也要注意,如果是内存泄露则比较严重;
          *Physicsdisk Time :物理磁盘读写时间情况。
          二是,Web服务器指标:
          *Avg Rps:平均每秒钟响应次数=总请求时间/秒数;
          *Avg time to last byte per terstion(mstes):平均每秒业务角本的迭代次数;*Successful Rounds:成功的请求;
          *Failed Rounds:失败的请求;
          *Successful Hits:成功的点击次数;
          *Failed Hits:失败的点击次数;
          *Hits Per Second:每秒点击次数;
          *Successful Hits Per Second:每秒成功的点击次数;
          *Failed Hits Per Second:每秒失败的点击次数;
          *Attempted Connections:尝试链接数。
          三是,数据库服务器指标:
          *User 0 Connections :用户连接数,也就是数据库的连接数量;
          *Number of deadlocks:数据库死锁;
          *Butter Cache hit:数据库Cache的命中情况。

    4. 简述使用Loadrunner的步骤

      A4制定性能测试计划—>开发测试脚本—>设计测试场景—>执行测试场景—>监控测试场景—>分析测试结果

    5. 什么时候可以开始执行性能测试?

      功能测试通过;一般需要进行性能测试的系统,都是用户量比较大、业务使用比较频繁、比较重要的功能模块。

    6. LoadRunner由哪些部件组成?

      A6主要有三部分组成:

    7. 你使用LoadRunner的哪个部件来录制脚本?

      使用Virtual User Generator录制测试脚本

    8. LoadRunner的哪个部件可以模拟多用户并发下回放脚本?

      LoadRunnerController组件。

    9. 什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?

      在性能测试过程中,需要模拟大量用户在同一时刻,访问系统并同时操作某一任务,可以通过配置集合点来实现,多个用户同时进行某操作;

      集合点可以在服务器上创建密集的用户负载,使LoadRunner能够测试服务器在负载状态下的性能。

     设置集合点函数:lr_rendezvous("Meeting") // Meeting是集合点名称

    10. 什么是场景?场景的重要性有哪些?如何设置场景?

      场景用于模拟用户实际业务操作;

    LoadRunner中场景有手工场景和面向目标的场景。

    设置场景:选择场景类型、设置运行时设置、模拟用户数、加减压方式、持续时间,配置负载生成

    1.选择场景中需要的脚本
    2.选择为目标场景,还是指定的手工场景
    3.设置用户数、设置产生负载的设备
    4.设置执行策略

    11. 请解释一下如何录制web脚本?

    LR通过转发请求,来捕获数据包,来形成脚本

    解释:1.基于浏览器的应用程序推荐使用HTML-based Script, 脚本中采用
    HTML页面的形式来表示,这种方式的Script脚本容易维护,容易理解,使用该选项中的advance中的第一个选项,如果单纯的HTML方式,是不允许使用关联的。
    2.不是基于浏览器的应用程序推荐使用URL-based Script,脚本中的表示采用基于URL 的方式,不是很好阅读。
    解释:1.是否记录录制过程中的ThinkTime,如果记录,还可以设置最大值,一般我不记录这个值。
    2.通知Vugen去重新设置每个action之间的Http context,缺省是需要的。
    3.完整记录录制过程的log
    4.保存一个本地的snapshot,可以加速显示
    5.把html的title放到web_reg_find函数里面
    6.支持的字符集标准
    7.Http header的录制,我们采用缺省即可,不需要用web_add_header去录制非标准的header信息。
    对录制的content的内容进行filter,不作为resource处理的。
     
    解释:这个就是我前面提到的关联,系统已经预先设置好了一些常见的关联rules,我们录制脚本之前,可以把系统的

    12. 为什么要创建参数?如何创建参数?
    参数:在环境变化时必须时脚本具有环境变化的能力,就需要参数化(客户端发送到服务器端)
    1.确定要参数话的数据
    2.设定规则形式来取值

    13.什么是关联?请解释一下自动关联和手动关联的不同。

    关联:很多构架用sessionid等方法标识不同任务和数据,应用在每次运行时方式发送数据不完全相同,需要利用的机制对录制的脚本进行处理,这种机制叫做关联(服务端发送到客户端)

    14.场景设置有哪几种方法?

    目标场景,手工场景

    15.你如何找出哪里需要关联?请给一些你所在项目的实例
    用户登陆,
    客户端发送请求后,服务端验证正确性后,发送给客户端sessionid,是某种规则产生。

    16. 你在哪里设置自动关联选项?
    两地方可以设置
    1.
    设置允许录制时进行自动关联,可以自定义规则


    2.
    录制完成后,vuser-scan action for correlations

    17.哪个函数是用来截取虚拟用户脚本中的动态值?(手工关联)

    web_reg_save_param()函数主要根据需要做关联的动态数据前面和后面的固定字符串来识别、提取动态数据,所以在做关联时,需要找出动态数据的左、右边界字符串。

    18.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志?
    Run-timelog
    当调试脚本时,可以只输出错误日志,当在场景找你管加载脚本时,日志自动变为不可用。
    Standard Log Option
    :选择标准日志时,就会在脚本执行过程中,生成函数的标准日志并且输出信息,供调试用。大型负载测试场景不用启用这个选项。
    扩展日志包括警告和其他信息。大型负载测试不要启用该选项。用扩展日志选项,可以指定哪些附加信息需要加到扩展日志中

    19.你如何调试LoadRunner脚本?
    VuGen有两个选项帮助调试Vuser脚本。Run Step by Step命令和断点(breakpoints)。Option对话框中的调试设置(Debug setting)项,可以确定在场景执行过程中执行轨迹范围。调试信息写在output窗口。可以用
    lr_set_debug_messag
    函数在脚本中手工设置信息类型。如果我们只想接收到一小段脚本的调式信息。

    20.你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。
    在创建用户自定义函数前我们需要和创建DLLexternal libary)。把库放在VuGen bin目录下。一旦加了库,把自定义函数分配做一个参数。该函数应该具有一下格式:__declspec (dllexport) char* <function name>(char*, char*)
    Milan

    21.什么是逐步递增?你如何来设置?
    Ramp up这个选项用于逐渐增加服务器的虚拟用户数或负载量。设置一个初始值而且可以在两个迭代之间设置一个值等待。设置Ramp up,请到‘Scenario Scheduling Options’

    22. 以线程方式运行的虚拟用户有哪些优点?
    VuGen提供了用多线程的便利。这使得在每个生成器上可以跑更多的虚拟用户。如果是以进程的方式跑虚拟用户,为每个用户加载相同的驱动程序到内存中,因此占用了大量的内存。这就限制了在单个生成器上能跑的虚拟用户数。如果按线程运行,给定的所有虚拟用户数(比如100)只是加载一个驱动程序实例到内存里。每个线程共用父驱动程序的内存,因此在每个生成器上可以跑更多的虚拟用户。

    23.当你需要在出错时停止执行脚本,你怎么做?
    lr_abort函数放弃虚拟用户脚本的执行。说明虚拟用户停止Action的执行,直接执行vuser_end然后结束执行。在出现错误情况下想手工放弃脚本的执行,这个函数是有用的。用这个函数停止脚本时,Vuser被指定为“Stopped”状态。为了这个函数起作用,开始时候就不能选择Run-Time Settings中的Continue on error选项

    24. 响应时间和吞吐量之间的关系是什么?
    吞吐量图显示的是虚拟用户每秒钟从服务器接收到的字节数。当和响应时间比较时,可以发现随着吞吐量的降低,响应时间也降低,同样的,吞吐量的峰值和最大响应时间差不多在同时出现。

    25.说明一下如何在LR中配置系统计数器?
    通过Web资源监视器,利用这些监控器可以分析web服务器的吞吐量、点击率、每秒http响应数以及每秒下载的页面数。

    26.什么是think timethink_time有什么用?
    思考时间是真实用户在action之间等待的时间。例如:当一个用户从服务器接收到数据时,用户可能需要在响应之前等待几分钟回顾数据,这种推迟被称为思考时间。

    27.标准日志和扩展日志的区别是什么?
    Standard Log Option:选择标准日志时,就会在脚本执行过程中,生成函数的标准日志并且输出信息,供调试用。大型负载测试场景不用启用这个选项。
    扩展日志包括警告和其他信息。大型负载测试不要启用该选项。用扩展日志选项,可以指定哪些附加信息需要加到扩展日志中

    28.解释以下函数及他们的不同之处。
    Lr_debug_message
    lr_debug_message
    函数在指定的消息级别
    //
    处于活动状态时发送一条调试消息。如果指定的
    //
    消息级别未处于活动状态,则不发出消息。
    Lr_output_message
    要发送不是特定错误消息的特殊通知,
    Lr_error_message
    函数将错误消息发送到
    //
    输出窗口和 Vuser日志文件
    Lrd_stmt lrd_exec
    函数执行 lrd_stmt设置的 SQL语句。
    Lrd_fetch
    函数从结果集中提取后续若干行
    result set.
    函数准备用于
    //
    通过光标输出字符串(通常为 SQL语句)
    //
    的下一结果集。对于 CtLib,它发出 ct_result
    //
    命令,并且在 ODBC中它运行用于当前数据库

    29.什么是吞吐量?
    单位时间内系统处理客户端的请求数。

    30.actioninitend除了迭代的区别还有其他吗?

    initend中不能使用集合点、事务等, initend只执行一次。

    31.在什么地方设置HTTP页面filter?

    runtime_settingsdownload filter里面进行设置。

    32.pot mapping的原理是什么?

    就是代理服务器

    33.HTTP的超时有哪三种?

    HTTP-request connect timeoutHTTP-request receive timeoutstep download timeout

    34.什么是contentcheck?如何来用?

    ContentCheck的设置是为了让VuGen检测何种页面为错误页面。如果被测的Web应用没有使用自定义的错误页面,那么这里不用作更改;如果被测的Web应用使用了自定义的错误页面,那么这里需要定义,以便让VuGen在运行过程中检测,服务器返回的页面是否包含预定义的字符串,进而判断该页面是否为错误页

    面。如果是,VuGen就停止运行,指示运行失败。

    使用方法:点击在runtime settings中点击“contentcheck”,然后新建立一个符合要求的应用程序和规则,设定需要查找的文本和前缀后缀即可使用。

    35.network中的speed simulation是模拟的什么带宽?

    模拟用户访问速度的带宽。

    36.生成WEB性能图有什么意义?大概描述即可。

    可以很直观的看到,在负载下系统的运行情况以及各种资源的使用情况,可以对系统的性能瓶颈定位、性能调优等起到想要的辅助作用。

    37.如果刷新controller里的脚本?

    controller中,点击detailisRefresh-script即可。

    38.进程和线程有什么区别

    线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样。在Controller中将使用驱动程序(如mdrv.exe、r3vuser.exe)运行vuser。如果按进程运行每个vuser,则对于每个vuser实例,都将反复启动同一驱动程序并将其加载到内存中。将同一驱动程序加载到内存中会占用大量的RAM(随机存储器)及其他系统资源。这就限制了可以在任一负载生成器上运行的vuser数量。如果按线程运行每个vuserController为每50vuser(默认情况下)仅启动驱动程序(如mdrv.exe)的一个实例。该驱动程序将启动几个vuser,每个vuser都按线程运行。这些线程vuser将共享父驱动进程的内存段。这就消除了多次重新加载驱动程序/进程的需要,节省了大量内存空间,从而可以在一个负载生成器上运行更多的Vuser.

    39.如何把脚本和结果放到load generator的机器上?

    controller中,点击Results-Results settings,在里面进行相应的设置即可。

    40.如何设置才能让集合点只对一半的用户生效?

    对集合点策略进行相应的设置即可。即在controller中,点击Scenario-Rendezvous-policy进行相应的设置即可,由于题目中“一半的用户”没有说明白具体指什么样的用户,现在不好确定具体对里面的哪个选项进行设置。

    41.LRdAPI分为几类

    A:通用的API:,就是跟具体的协议无关,在任何协议的脚本里都能用的;

    B:针对协议的:像lrs前缀是winsock的;lrd的是针对database;

    C:自定义的:这个范围就比较广了;比如至少有Java Vuser APIlrapiXML API。还可以添加WindowsAPI和自定义函数库。

    42.LR几种日志函数的区别?

    lr_message int lr_message (const char *format, exp1, exp2,…expn.);中文解释:lr_message函数将信息发送到日志文件和输入窗口。在VuGen中运行时,输入文件为output.txt

    lr_log_message int lr_log_message (const char *format, exp1, exp2,…expn.);中文解释:lr_log_message函数将消息发送到Vuser或代理日志文件(取决于应用程序),而不是发送到输出窗口。通过向日志文件发送错误消息或其他信息性消息,可以将该函数用于调试。lr_error_message int lr_error_message (const char *format, exp1, exp2,…expn. );中文解释:lr_error_message函数将错误消息发送到输出窗口和Vuser日志文件。要发送不是特定错误消息的特殊通知,请使用lr_output_message

    lr_output_message int lr_output_message (const char *format, exp1, exp2,…expn.);中文解释:lr_output_message函数将带有脚本部分的行号的消息发送到输出窗口和日志文件

    lr_debug_message函数组】 int lr_debug_message (unsigned int message_level, const char *format, … );中文解释:lr_debug_message函数在指定的消息级别处于活动状态时发送一条调试信息。如果指定的消息级别未出于活动状态,则不发送消息。您可以从用户界面或者使用lr_set_debug_message,将处于活动状态的消息级别设置为MSG_CLASS_BRIEF_LOGMSG_CLASSS_EXTENDED_LOG。要确定当前级别,

    请使用lr_get_debug_message unsigned int lr_get_debug_message ( );中文解释:lr_get_debug_message函数返回当前的日志运行时设置。该设置确定发送到输出端的信息。日志设置是使用运行时设置对话框或通过使用lr_set_debug_message函数指定的。int lr_set_debug_message (unsigned int message_level, unsigned int on_off); 中文解释:lr_set_debug_message函数设置脚本执行的调试消息级别message_lvl。通过设置消息级别,可以确定发送哪些信息。启动设置的方法是将LR_SWITCH_ON作为on_off传递,禁用设置的方法是传递LR_SWITCH_OFF

    lrd_stmt】:将SQL语句与光标关联

    lrd_fetch:提取结果集中得下一条记录

    43.性能瓶颈分析方法?

    同一场景
    1.小用户量的情况下测试
    2.大用户量情况下的测试
    分析的方法:
    整个系统架构分析,系统响应时间消耗,利用图表分析
    查看事务响应时间,通过事务摘要图分析事务响应时间,那个消耗最大(通过小用户量和大用户量的响应时间分析,查看那个事务响应时间最高),确定哪部分功能是性能的瓶颈,分析window resource图表,查看cpu
    使用下列计数器标识cpu瓶颈
    Processor\ Interrupts/sec
    Processor\ % Processor Time
    Process(process)\ % Processor Time
    System\ Processor Queue Length
    通过它来确定是否硬件本身出现瓶颈,或者进一步确定应该怎么去判断性能产生瓶颈的地方!
    下一步去判断进程,那个进程消耗cpu最高
    下边就有很多种情况需要你自己去判断,有可能是进程调用了的函数消耗了系统资源形成上边的问题,也有可能是后台数据库出现的问题(这个就要看你的系统配置是什么样的,比如你的db服务器和应用服务器都配置在一台机器上)
    性能产生瓶颈有很多地方,所以需要进一判断,是否是后台数据库的问题还有待分析,是那条语句导致的问题需要进一步分析判断。
    分析原则:
    具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)
    查找瓶颈时按以下顺序,由易到难。
    服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库,web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)
    注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。
    分段排除法很有效
    分析的信息来源:
    •1 根据场景运行过程中的错误提示信息
    •2 根据测试结果收集到的监控指标数据
    一.错误提示分析
    分析实例:
    1 •Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection
    •Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely
    分析:
    •A、应用服务死掉。
    (小用户时:程序上的问题。程序上处理数据库的问题)
    •B、应用服务没有死
    (应用服务参数设置问题)
    例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25
    •C、数据库的连接
    (1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))
    2 Error: Page download timeout (120 seconds) has expired
    分析:可能是以下原因造成
    •A、应用服务参数设置太大导致服务器的瓶颈
    •B、页面中图片太多
    •C、在程序处理表的时候检查字段太大多
    二.监控指标数据分析
    1.最大并发用户数:
    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。
    在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。
    如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。
    2.业务操作响应时间:
    分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用事务性能摘要图,可以确定在方案执行期间响应时间过长的事务。
    细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?
    如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用网络监视器图确定导致性能瓶颈的网络问题
    3.服务器资源监控指标:
    内存:
    1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。
    2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。
    内存资源成为系统性能的瓶颈的征兆:
    很高的换页率
    (high pageout rate);
    进程进入不活动状态
    ;
    交换区所有磁盘的活动次数可高
    ;
    可高的全局系统CPU利用率
    ;
    内存不够出错
    (out of memory errors)
    处理器:

    1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85%
    合理使用的范围在60%70%
    2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。
    CPU资源成为系统性能的瓶颈的征兆:
    很慢的响应时间
    (slow response time)
    CPU
    空闲时间为零
    (zero percent idle CPU)
    过高的用户占用CPU时间
    (high percent user CPU)
    过高的系统占用CPU时间
    (high percent system CPU)
    长时间的有很长的运行进程队列
    (large run queue size sustained over time)
    磁盘I/O

    1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。
    2 Windows资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。
    I/O资源成为系统性能的瓶颈的征兆:
    过高的磁盘利用率
    (high disk utilization)
    太长的磁盘等待队列
    (large disk queue length)
    等待磁盘I/O的时间所占的百分率太高
    (large percentage of time waiting for disk I/O)
    太高的物理I/O速率
    :large physical I/O rate(not sufficient in itself)
    过低的缓存命中率
    (low buffer cache hit ratio(not sufficient in itself))
    太长的运行进程队列,但CPU却空闲
    (large run queue with idle CPU)
    4
    .数据库服务器:
    SQL Server数据库:
    1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。
    2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。
    3 Number of Deadlocks/sec(死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0
    4 Lock Requests/sec(锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。

    Oracle数据库:
    1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
    快存(共享SQL区)和数据字典快存的命中率:
    select(sum(pins-reloads))/sum(pins) from v$librarycache;
    select(sum(gets-getmisses))/sum(gets) from v$rowcache;
    自由内存 select * from v$sgastat where name=’free memory’;
    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)
    缓冲区高速缓存命中率:
    select name,value from v$sysstat where name in (‘db block gets’,
    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))
    3
    如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
    日志缓冲区的申请情况:
    select name,value from v$sysstat where name = ‘redo log space requests’ ;
    4
    如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序。
    内存排序命中率:

    展开全文
  • 强制解除端口占用可以使用我最新开发的新版本PHPWAMP_IN2(截止目前最新版) PHPWAMP最新版支持自定义Mysql版本和自定义PHP版本,是目前唯一集成了VC运行库的真正纯绿色软件。 最新版PHPWAMP支持180多个数据库...
  • 端口号功能主要用于Apache与IIS等WEB服务器共存时,去除域名后面所带的端口 本文案例采用我开发的纯绿色PHP集成环境PHPWAMP里面的“去端口”功能模块。 案例演示: 点击常用工具,打开“去掉域名非80端口”...
  • Win7如何简单的关闭445端口及445端口入侵详解

    万次阅读 多人点赞 2017-05-13 11:07:03
    最近永恒之蓝病毒攻击了很多教育网的同学,下面我们就来看一下如何关闭445端口 根据网络安全机构通报,这是不法分子利用NSA黑客武器库泄漏的“永恒之蓝”发起的病毒攻击事件。“永恒之蓝”会扫描开放445文件共享...
  • 1.添加映射 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 -t nat : 指出我要操作什么表.(不写就表示filter.... -A PREROUTING : A 添加的意思....--dport 80 : 如果请求80端...
  • 各种端口扫描技术的相关原理

    万次阅读 2020-08-20 15:34:54
    如果对方主机端口开放则无反应。如果端口关闭,则会返回一个rst包。对windows主机来说无论端口开放与否,都返回rst。 Fin扫描 发送flag为fin的数据包,如果对方端口开放,则无反应。如果关闭则反回一个rst包。类似...
  • hadoop端口

    万次阅读 2017-11-20 14:03:40
    Hadoop部署完分布式集群后,运行了一些组件,会产生很多进程,和web可以访问的端口,容易混淆,这里把一些常见的进程,进程的作用和端口进行归纳,总结,方便区分。 操作步骤1. HDFS进程及端口 HDFS启动后包含的...
  • 修改 nginx 的默认端口

    万次阅读 热门讨论 2018-05-08 17:03:37
    首先找到配置文件在哪 whereis nginx.conf 你可以这几个目录都看一遍,看看配置文件在哪里。我这边正确目录是 /etc/nginx ...其次找到真正的配置文件 ...打开一看,懵了,哪里有 listen 80 这一行呢?...
  • 前言:很多时候Tomcat部署好Web项目之后访问项目的时候都需要加上端口号和项目名,如:http://localhost:8080/项目名,下面我会介绍可以不用输端口号和项目名便可以直接进行访问的方法,其实就是修改Tomcat下conf...
  • 修改docker容器端口

    万次阅读 2018-09-08 00:45:58
    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。 有没有办法不保存镜像而直接修改已有的这个...
  • ssh端口转发原理与实现

    万次阅读 2020-10-10 15:59:34
    CATALOGssh端口转发其他在meterpreter上配置路由配置proxychainsew ssh端口转发 一些命令参数 -C 压缩数据传输-f 后台登录用户名密码-N 不执行shell[与-g 合用] -g 允许打开的端口让远程主机访问 在一台公网服务器...
  • Linux下Centos7对外开放端口

    万次阅读 多人点赞 2018-08-25 09:53:42
    概要 ...务器上docker要做好内部和外部端口的映射,关键还要对对外开放的端口添加到防火墙中。 内容介绍的逻辑是:本篇文章先记录Centos7下查看防火墙状态和网络状态命令;下一篇将介绍通过docker...
  • Centos7开放3306端口

    万次阅读 2020-08-06 11:42:09
    语法命令如下:启用区域端口和协议组合 firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>] 此举将启用端口和协议的组合。 端口可以是...
  • Linux 如何开放端口和关闭端口

    万次阅读 多人点赞 2018-05-15 21:42:07
    二、关闭端口号: iptables -A OUTPUT -p tcp --dport 端口号-j DROP 三、打开端口号: iptables -A INPUT -ptcp --dport 端口号-j ACCEPT 四、以下是linux打开端口命令的使用方法。  nc -lp 23 &amp;(打开...
  • 常用端口大全

    万次阅读 多人点赞 2018-08-22 21:58:57
    端口 说明 0 无效端口,通常用于分析操作系统 1 传输控制协议端口服务多路开关选择器 2 管理实用程序 3 压缩进程 5 远程作业登录 7 回显 9 丢弃 11 在线用户 13 时间 17 ...
  • nginx反向代理——将80端口请求转发到8080

    万次阅读 热门讨论 2018-03-25 11:09:46
    1,nginx通过对url里面的一些判断(转达规则配置在nginx配置文件中),比如端口号(nginx默认是80)有可能是对二级域名来判断 比如test1.baidu.com,test2.baidu.com,这就是两个二级域名,这里的一级域名...
  • 我们在访问时会在url中加入对应的端口号,如:http://xxx.xxx.xxx:8006/,但如果在nginx服务器前有另一台服务器作为用户首先访问的web服务器,这台服务器设置了端口转发,将80端口获得的请求转发到nginx中的对应端口...
  • 端口

    万次阅读 2019-02-26 22:39:12
    0端口:无效端口,通常用于分析操作系统 1端口:传输控制协议端口服务多路开关选择器 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:...
  • 端口大全

    千次阅读 2017-09-02 17:29:39
    声明:本博文为转载博文,便于以后查找与使用顾转载,原博文地址:https://www.douban.com/note/568630865/,在此感谢该博主2端口:管理实用程序3端口:压缩进程5端口:远程作业登录7端口:回显9端口:丢弃11端口:在线...
  • STP:五种端口状态与角色 RSTP:3种端口状态与角色

    万次阅读 多人点赞 2018-10-17 17:23:33
    阻塞(blocking) - 该端口是非指定端口,不参与帧转发。此类端口接收 BPDU 帧来确定根桥交换机的位置和根 ID,以及最终的活动 STP 拓扑中每个交换机端口扮演的端口角色。 侦听(listening) - STP 根据交换机迄今...
  • 端口号大全

    万次阅读 多人点赞 2019-03-14 08:38:16
    计算机系统“端口”是英文 port 的义译,可以认为是计算机与外界通讯交流的出口。其中 硬件领域的端口又称接口,如:USB 端口、串行端口、打印机端口等。软件领域的端口一般 指网络中面向连接服务和无连接服务的通信...
  • 程序报错端口号冲突。 估计是80端口被占用了,但是想绑定域名,还是需要将80端口映射到tomcat才行。 于是检查占用80端口的程序 输入命令:netstat-ano,列出所有端口的情况。在列表中我们观察被占
  • 前言 本文所写的远程为各个电脑在同一个网段内 本文主要详细介绍如何远程访问虚拟机里面的项目! 机器:虚拟机(装在电脑1里)、电脑1(宿主机)、电脑2、电脑3、电脑4...主机端口:随便选取一个宿主机没有被占用...
  • 端口被占用,还要打开任务管理器,密密麻麻找不到java.exe 优点: 绿色解压版,卸载直接删除文件即可,无残留,开源免费 下载 原作者Github:https://github.com/yfinternet/portSpirit CSDN免积分下载 Github下载...
  • linux查看端口号占用命令-netstat

    万次阅读 多人点赞 2018-01-15 15:37:23
    查看端口号 netstat 如果发现某个端口被占用后,可以用命令查看,该端口到底是被哪个进程所占用。命令如下: netstat -pan | grep 5623 #其中5623位端口号 如图: 发现5623的端口,被28425的进程id所占用,继
  • windows 端口

    千次阅读 2015-03-17 14:21:06
    计算机“端口”是英文port的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口 一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象...
  • 网络常用端口号大全

    万次阅读 2019-06-18 14:13:11
    端口号---具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配(当然,一般在软件编写时就已经定义)。当然,有很多应用软件有公认的默认的端口,比如FTP:20和21,HTTP:80,TELNET...

空空如也

1 2 3 4 5 ... 20
收藏数 1,933,109
精华内容 773,243
关键字:

url请求的端口号后面是啥