网络结构
计算机网络有哪些结构?
计算机网络一共有 3 种模型。
- OSI 七层结构
- TCP/IP 结构
- 五层协议结构

OSI 是 Open Systems Interconnect,也就是开放的互联系统,将复杂的互联网系统划分为不同块,方便处理。实际应用中,并没有采用这个理论模型,而是使用 TCP/IP 协议的四层模型。而 5 层模型是一个理论上的网络通信模型,方便教学的时候理解,实际上并不存在。
计算机网络中各层分别的作用
应用层(application layer)
应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程(process)就是指主机中正在运行的程序。
常见的协议有域名系统 DNS,万维网应用的HTTP 协议,支持电子邮件的 SMTP 协议。把应用层交互的数据单元称为报文。
运输层(transport layer)
运输层的任务就是负责向两个主机中进程之间的通信提供通用的数据传输服务。
应用进程利用该服务传送应用层报文。所谓通用,是指并不针对某个特定网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个进程,因此运输层有复用和分用的功能。
复用就是多个应用层进程可同时使用下面运输层的服务,分用与复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
- 传输控制协议TCP (Transmission Control Protocol)——提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。
- 用户数据报协议 UDP (User Datagram Protocol)——提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。
TCP 的主要特点
- TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
- 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
- TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
- TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
- 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
UDP 的主要特点
- UDP 是无连接的;
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
- UDP 是面向报文的;
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
- UDP 支持一对一、一对多、多对一和多对多的交互通信;
- UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
网络层(network layer)
网络层(network layer)负责为分组交换网上的不同主机提供通信服务。
- 把运输层产生的报文段或用户数据报封装成分组或包(packet)进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫作 IP数据报,或简称为数据报(datagram)。
- 选择合适的路由,使源主机运输层所传下来的分组能够通过网络中的路由器找到目的主机。
请注意:不要将运输层的“用户数据报UDP”和网络层的“IP数据报”弄混。此外,无论在哪一层传送的数据单元,都可笼统地用“分组”来表示。
这里要强调指出,网络层中的“网络”二字,已不是我们通常谈到的具体的网络,而是在计算机网络体系结构模型中的专用名词。
因特网,它由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来。因特网主要的网络层协议是无连接的网际协议IP (Internet Protocol)和许多种路由选择协议,因此因特网的网络层也叫做网际层或IP层。网络层、网际层和IP层都是同义语。
数据链路层(data link layer)
数据链路层常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取出数据部分,上交给网络层。
控制信息还使接收端能够检测到所收到的帧中有无差错。如发现有差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在数据链路层传输时出现的差错(这就是说,数据链路层不仅要检错,而且要纠错),那么就要采用可靠传输协议来纠正出现的差错。这种方法会使数据链路层的协议复杂些。
物理层(physical layer)
在物理层上所传数据的单位是比特。发送方发送1(或0)时,接收方应当收到1(或0)而不是0(或1)。因此物理层要考虑用多大的电压代表“1”或“0”,以及接收方如何识别出发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各条引脚应如何连接。当然,解释比特代表的意思,就不是物理层的任务。请注意,传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议之内而是在物理层协议的下面。因此也有人把物理媒体当作第0层。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。(物理层的任务就是透明地传送比特流)
在因特网所使用的各种协议中,最重要的和最著名的就是TCP和IP两个协议。现在人们经常提到的TCP/IP并不一定是单指TCP和IP这两个具体的协议,而往往是表示因特网所使用的整个TCP/IP协议族(protocol suite/swiːt/)。
总结

TCP/IP 协议
TCP/IP 协议的结构

TCP 和 UDP 的区别

UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
- TCP:面向连接,面向字节流,可靠,传输慢,有流量控制阻塞控制。
- UDP:广播形式不需要连接,面向报文,不可靠,传输快,无流量控制阻塞控制。
解释一下报文和字节流的区别:
- 字节流:发送次数和接收次数可以不相同,比如向水池倒了 20 盆水,可以开水龙头一次性全放出。
- 报文:发送次数和接收次数必须相同。
三次握手和四次挥手
TCP 协议如何保证可靠传输
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- 停止等待协议 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
停止等待协议
- 停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组;
- 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
1) 无差错情况:
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
2) 出现差错情况(超时重传):
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续 ARQ 协议 可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。
3) 确认丢失和确认迟到
- 确认丢失:确认消息在传输过程丢失
当A发送M1消息,B收到后,B向A发送了一个M1确认消息,但却在传输过程中丢失。而A并不知道,在超时计时过后,A重传M1消息,B再次收到该消息后采取以下两点措施:- 丢弃这个重复的M1消息,不向上层交付。
- 向A发送确认消息。(不会认为已经发送过了,就不再发送。A能重传,就证明B的确认消息丢失)。
- 确认迟到 :确认消息在传输过程中迟到
A发送M1消息,B收到并发送确认。在超时时间内没有收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息(B收到了2份M1)。此时A收到了B第二次发送的确认消息。接着发送其他数据。过了一会,A收到了B第一次发送的对M1的确认消息(A也收到了2份确认消息)。处理如下:- A收到重复的确认后,直接丢弃。
- B收到重复的M1后,也直接丢弃重复的M1。
自动重传请求 ARQ 协议
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。
优点: 简单
缺点: 信道利用率低
连续ARQ协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。
滑动窗口
- TCP 利用滑动窗口实现流量控制的机制。
- 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
- TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
流量控制
- TCP 利用滑动窗口实现流量控制。
- 流量控制是为了控制发送方发送速率,保证接收方来得及接收。
- 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
- 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。

- 拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1。
- 快重传与快恢复:在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

TCP 协议如何进行流量控制
控制流量的前提当然需要保证正确率,因此首先要引入 ARQ 协议。
无差错时,A 向 B 发送分组M1,B 收到 M1 后向 A 回复,A 收到回复后,发送下一个 M2…..

如果出现差错,B 没有收到信息,自然不会回复,A 等待超时后,自动重传一个信息 M,这就是所谓的 ARQ。
停止等待 ARQ 协议信道利用率太低,所以需要使用连续 ARQ 协议来进行改善。这个协议会连续发送一组数据包,然后再等待这些数据包的 ACK。

连续 ARQ 协议通常是结合滑动窗口协议来使用的,发送方需要维持一个发送窗口,如下图所示:

位于发送窗口内的 5 个分组都可以连续发送出去,而不需要等待对方的确认,这样就提高了信道利用率。发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方一般都是采用累积确认的方式。收到几个分组后,对按序到达的最后一个分组发送确认。
下载时我们的速度一般都是由慢变快,原因就是拥塞控制。
TCP 协议如何进行拥塞控制
网络拥塞是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况。
常见的拥塞控制有:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
发送方维持一个叫做拥塞窗口 cwnd(congestion window)的状态变量。当 cwndssthresh 时,改用拥塞避免算法。
慢开始:不要一开始就发送大量的数据,由小到大逐渐增加拥塞窗口的大小。
拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1 而不是加倍。这样拥塞窗口按线性规律缓慢增长。
快重传:我们可以剔除一些不必要的拥塞报文,提高网络吞吐量。比如接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。快重传规定:发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

快恢复:主要是配合快重传。当发送方连续收到三个重复确认时,就执行 “乘法减小” 算法,把 ssthresh 门限减半(为了预防网络发生拥塞),但接下来并不执行慢开始算法,因为如果网络出现拥塞的话就不会收到好几个重复的确认,收到三个重复确认说明网络状况还可以。

为什么这两个要放在一起说呢?因为这两个协议都是用于地址间的转化,都是起到了翻译官的职责。
DNS 协议和 ARP 协议
DNS 解析过程
DNS (Domain Name System) 是 域名系统 的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它从事将主机名或域名转换为实际 IP 地址的工作,类似于翻译官。
DNS 查询时优先考虑本地的 Host 文件和本地的 DNS 解析器是否保留有缓存映射,如果没有就向上一级请求。依次按照DNS 根服务器,DNS 顶层服务器,DNS 管理方服务器的顺序请求。

所谓递归查询就是变更查询者,迭代查询则没有变更:这个例子中查询者由客户端变为了本地 DNS 服务器,所以是递归查询。
MAC 地址
MAC 地址是数据链路层和物理层使用的地址是硬件地址,IP 地址网络层和以上各层使用的地址,是一种逻辑地址。在发送数据时,数据从高层到低层,然后才到通信链路上传输。使用 IP 地址的 IP 数据报一旦交给了数据链路层,就被封装成了 MAC 帧。MAC 帧在传送时使用的源地址和目的地址都是硬件地址。

ARP 协议工作机制
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址。
在每台安装有 TCP/IP 协议的电脑或路由器里都有一个 ARP 缓存表,表里的 IP 地址与 MAC 地址是一对应的,如下表所示。

解析 MAC 地址时,主机 A 首先在其 ARP 高速缓存中查找有无主机 B 的 IP 地址。
如果没有就就向本地网段发起一个 ARP 请求的广播包,查询此目的主机对应的 MAC 地址。网络中所有的主机收到这个 ARP 请求后,会检查数据包中的目的 IP 是否和自己的 IP 地址一致。如果相同,该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中,如果 ARP 表中已经存在该 IP 的信息,则将其覆盖,然后给源主机发送一个 ARP 响应数据包,告诉对方自己是它需要查找的 MAC 地址。

收到后在其 ARP 高速缓存中写入主机 B 的 IP 地址到硬件地址的映射。并且采用 LRU 机制,及时淘汰。
HTTP 协议
HTTP 常见的状态码

HTTP 协议和其他协议之间的关系
HTTP(超文本传输协议)是利用 TCP 在两台电脑 (通常是 Web 服务器和客户端) 之间传输信息的协议。如果 TCP 是高速路,HTTP 就是卡车。Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API),通过 Socket,我们能方便地使用 TCP/IP 协议。
HTTP 长连接和短连接
| 短连接 | 客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接 |
|---|---|
| 长连接 | 客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。有一个保持时间。 |
HTTP 和 HTTPS 的区别
| HTTP | 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 |
|---|---|
| HTTPS | Https 是身披 SSL(Secure Socket Layer) 外壳的 Http,运行于 SSL 上,SSL 运行于 TCP 之上,是添加了加密和认证机制的 HTTP |
GET 和 POST 的区别
- GET 用于从服务器获取资源,POST 用于更新服务器的资源
- GET 不会改变服务器的资源,而 POST 会
- GET 请求的数据会附在 URL 之后,比如
http:localhost:8080/id=101?,而 POST 的数据则是放在请求正文中。因此,GET 不安全,GET 的长度受限制。
Cookie 和 Session 的区别
Cookie 和 Session 都是客户端与服务器之间保持状态的解决方案,具体来说,cookie 机制采用的是在客户端保持状态的方案,而 session 机制采用的是在服务器端保持状态的方案。
Cookie 实际上是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器,服务器检查该 Cookie,以此来辨认用户状态。
Session 的区别在于,会话状态完全保存在服务器。客户端请求服务器,如果服务器记录该用户状态,就获取 Session 来保存状态,这时,如果服务器已经为此客户端创建过 session 就按照 sessionid 把这个 session 检索出来使用。服务器 Session 常常依赖于 Cookie 机制检索 ID,但 Cookie 被禁用时也有其他方法比如 URL 重写机制。
HTTP 请求报文和响应报文的格式
请求报文格式:
- 请求行(请求方法 + URI 协议 + 版本)
- 请求头部
- 空行
- 请求主体 ``` GET / HTTP/1.1 Host: localhost Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 Edg/84.0.522.44 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 If-None-Match: W/“5efaefea-264” If-Modified-Since: Tue, 30 Jun 2020 07:55:22 GMT
username=jinqiao&password=1234
响应报文:1. 状态行(版本 + 状态码 + 原因短语)2. 响应首部3. 空行4. 响应主体
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Sat, 25 Jul 2020 11:45:10 GMT Last-Modified: Tue, 30 Jun 2020 07:55:22 GMT Content-Type: text/html ETag: W/“5efaefea-264” Content-Encoding: gzip X-DNS-Prefetch-Control: off
<!DOCTYPE html>
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
<a name="739749d5"></a>## HTTP1.1 和 2.01.1 新功能- 支持长链接- 通过虚拟站点技术能够使不同域名配置在同一个 IP 地址的服务器上2.0 新功能- 可以使用同一个连接并行发送多个请求和响应,可以**承接双向数据流**- 允许设定数据流中不同资源的**优先级**,明确资源处理的先后顺序- 打破了请求 - 响应的束缚,除了最初的请求响应外,服务器还能向客户端**推送额外的资源**(客户端没有明确要求的情况下)---<a name="9ZidE"></a># IP 地址<a name="VuD4U"></a>## IP 地址的格式什么是 IP 地址?IP 协议提供的一种统一的地址格式,**它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。**IP 地址编址方案将 IP 地址空间划分为 A、B、C、D、E 五类,其中 A、B、C 是基本类,D、E 类作为多播和保留使用,为特殊地址。每个 IP 地址包括两个标识码(ID)- 网络 ID- 主机 ID。同一个物理网络上的所有主机都使用同一个网络 ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机 ID 与其对应。3 字节的网络地址 + 1 字节主机地址的意思就是:前三段号码为网络号码,剩下的一段号码为本地计算机的号码。- **A 类地址**:1 字节的网络地址 + 3 字节主机地址,网络地址的最高位必须是 0。A 类 IP 地址的地址范围 1.0.0.0 到 127.255.255.255,IP 地址的子网掩码为 255.0.0.0,每个网络支持的最大主机数为`256^3-2`- **B 类地址**:2 字节的网络地址 + 2 字节主机地址,网络地址的最高位必须是 10。B 类 IP 地址地址范围 128.0.0.0-191.255.255.255B 类 IP 地址的子网掩码为 255.255.0.0,每个网络支持的最大主机数为`256^2-2`。注:1000 0000=128- **C 类地址**:3 字节的网络地址 + 1 字节主机地址,网络地址的最高位必须是 110。C 类 IP 地址范围 192.0.0.0-223.255.255.255 每个网络支持的最大主机数为`256-2`。**适用于小规模局域网络**。- **D 类地址**:多播地址,用于 1 对多通信,最高位必须是 1110。范围从 224.0.0.0 到 239.255.255.255。- **E 类地址**: 为保留地址,最高位必须是 “1111”<a name="2e9bb164"></a>## 单播广播多播的区别**单播:主机间一对一通信**。优点:个性化服务,及时响应;缺点:流量压力大。**广播:主机间一对所有通信**。优点:布局简单,维护方便,流量负载低。缺点:缺乏个性化服务,无法在 Internet 宽带上传播。**多播(组播):主机间一对一组通信**。优点:兼具流量负载和个性化的优点,允许在 Internet 宽带上传播。缺点:与单播协议相比没有纠错机制。<a name="45469df1"></a>## 如何划分子网划分子网的方法是从主机号借用若干个位作为子网号,而主机号也就相应减少了若干个位。于是两级 IP 地址在本单位内部就变为三级 IP 地址:网络号、子网号和主机号。区分子网号和主机号的办法是:通过**子网掩码**将**网络号和子网号全设为 1**的 IP 地址为子网掩码。假设公司有 4 个部门,A 部门有 10 台主机,B 部门有 15 台主机,C 部门有 30 台主机,D 部门有 20 台主机。分配了一个总的网段为:192.168.2.0/24。请问该如何划分子网?**网段前面的数字是我们的网络地址,后面的 24 表示用 24 位来表示网络位,用 32-24=8 位来表示主机位**。主机数目不多,可以小型组网,因此采用 C 类地址 (最大 254 个主机),默认掩码为 225.255.255.0。首先假设借用主机位 2 位来划分 4 个子网,则子网掩码组合为:
11111111.11111111.11111111.00000000 11111111.11111111.11111111.01000000 11111111.11111111.11111111.10000000 11111111.11111111.11111111.11000000
然而全为 0 和全为 1 的地址不能用,所以我们需要借用主机位 3 位,划分`8-2=6`个子网:
11111111.11111111.11111111.00100000 11111111.11111111.11111111.01000000 11111111.11111111.11111111.01100000 11111111.11111111.11111111.10000000 11111111.11111111.11111111.10100000 11111111.11111111.11111111.11000000
验证一下:最后提供的主机位数是`2^5=32`,也就是说每个子网最大的主机数是 32,符合题目要求。所以子网划分如下:
(1)255.255.255.32: 192.168.2.33~ 192.168.2.62 (2)255.255.255.64: 192.168.2.65~ 192.168.2.94 (3)255.255.255.96: 192.168.2.97~ 192.168.2.126 (4)255.255.255.128: 192.168.2.129~ 192.168.2.158 (5)255.255.255.160: 192.168.2.161~ 192.168.2.190 (6)255.255.255.192: 192.168.2.193~ 192.168.2.222
子网掩码是:
11111111.11111111.11111111.11100000 255.255.255.224
---<a name="7FLzP"></a># 网络安全<a name="VDXOm"></a>## DDos 攻击?DDos 全称 Distributed Denial of Service,分布式拒绝服务攻击。最基本的 DOS 攻击过程如下:1. 客户端向服务端发送请求链接数据包2. 服务端向客户端发送确认数据包3. 客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认DDoS 则是采用分布式的方法,通过在网络上占领多台 “肉鸡”,用多台计算机发起攻击。DOS 攻击现在基本没啥作用了,因为服务器的性能都很好,而且是多台服务器共同作用,1V1 的模式黑客无法占上风。对于 DDOS 攻击,预防方法有:- **减少 SYN timeout 时间。**在握手的第三步,服务器会等待 30 秒 - 120 秒的时间,减少这个等待时间就能释放更多的资源。- **限制同时打开的 SYN 半连接数目。**<a name="4c181be3"></a>## XSS 攻击XSS 也称 cross-site scripting,**跨站脚本**。这种攻击是**由于服务器将攻击者存储的数据原原本本地显示给其他用户所致的**。比如一个存在 XSS 漏洞的论坛,用户发帖时就可以引入**带有<script>标签的代码**,导致恶意代码的执行。预防措施有:- 前端:过滤- 后端:转义,比如 go 自带的处理器就具有转义功能。<a name="881dd133"></a>## 注入 SQL 攻击XSS 是将脚本代码注入,而 SQL 注入攻击顾名思义就是注入 SQL 语句。某个网站的登录验证的SQL查询代码为:```javastrSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
恶意填入
userName = "1' OR '1'='1";
与
passWord = "1' OR '1'='1";
时,将导致原本的SQL字符串被填为
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;"
因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
预防方法:
- 限制数据库权限,给用户提供仅仅能够满足其工作的最低权限。
- 对进入数据库的特殊字符(’”\尖括号 &*; 等)转义处理。
- 提供参数化查询接口,不要直接使用原生 SQL
综合问题
浏览器中输入 URL 地址到显示主页的过程是什么?

- 客户端输入URL地址,客户端进行DNS查询,获取域名IP地址
- 客户端拿到IP地址后,会向服务器发起TCP连接请求,通过三次握手建立连接
- 建立TCP连接后,客户端发起一个HTTP请求
- 服务器收到HTTP请求后,处理请求,返回一个HTTP响应
- 浏览器收到HTML,CSS,JS文件,解析渲染成页面
- 关闭tab页面,客户端主动发起关闭请求,通过四次挥手关闭TCP连接
ping 命令的具体过程
假设现在有 ABCD 四台主机,一台路由,子网掩码为 255.255.255.0,默认路由为 192.168.0.1
在主机 A 上运行Ping 192.168.0.5后,
- Ping 命令会构建一个ICMP 协议的数据包,交到网络层的 IP 协议中。IP 层协议将目的地址和源地址打包后,形成 IP 数据包
- 获取 192.168.0.5 的 MAC 地址
- 交到数据链路层,添加一些控制信息,构建数据帧
- 交到物理层,通过以太网访问
主机 B 收到后,
- 检查目的地址,不相符就丢弃
- 将 IP 数据包提取后送入网络层的 IP 层协议,IP 层检查后将有用的信息提取后送入 ICMP 协议
- ICMP 协议马上构建一个 ICMP 应答包以之前的相同方式发送给主机
根据条件:是否在同一网段内,流程可能有所不同,区别在于 MAC 的获取方式,具体参见 ARP 协议。
负载均衡算法
多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,能互相分担负载。
- 轮询法:将请求按照顺序轮流的分配到服务器上。大锅饭,不能发挥某些高性能服务器的优势
- 随机法:随机获取一台,和轮询类似
- 哈希法:通过 ip 地址哈希化来确定要选择的服务器编号。好处是, 每次客户端访问的服务器都是同一个服务器,能很好地利用 session 或者 cookie
- 加权轮询:根据服务器性能不同加权
