计算机网络面试题
应用层有哪些常见的协议?
HTTP:超文本传输协议
超文本传输协议(HTTP,Hyper Text Transfer Protocol)主要是为了Web浏览器与Web服务器之间的通信而涉及的,当我们使用浏览器浏览网页的时候,我们网页就是通过HTTP请求进行加载的。
HTTP协议是基于TCP协议,发送HTTP请求之前首先要建立TCP连接也就是要经历3次握手。目前使用的HTTP协议大部分都是1.1.在1.1的协议里面,默认是开启了Keep-Alive的,这样的话建立的连接就可以在多次请求中被复用了。
另外,HTTP协议是”无状态“的协议,它无法记录客户端用户的状态,一般我们都是通过Session来记录客户端用户的状态。
HTTP1.0、1.1、2.0
HTTP1.0:
(1)无状态,无连接
(2)短连接:每次发送请求都要重新建立TCP请求,即三次握手,非常浪费性能
(3)无host头域,也就是http请求头里的host
(4)不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象
HTTP1.1:
(1)长连接,流水线,使用connection:keep-alive使用长连接
(2)请求管道化
(3)增加缓冲处理(新的字段如cache-control)
(4)增加Host字段,支持断点传输等
(5)由于长连接会给服务器造成压力
HTTP2.0:
(1)二进制分帧
(2)头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小。
(3)多路复用(或共享连接),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求
(4)服务器推送
HTTP与HTTPs的区别
(1)https协议需要到CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。
(2)http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
(3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
(4)http的连接很简单,是无状态的。https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息)
HTTP原理
HTTPS原理
请描述一次完整的HTTP请求的过程是怎么样的?在浏览器输入一个URL,会发生什么?
SMTP:简单邮件传输协议
简单邮件传输协议(STMP,Simple Mail Transfer Protocol)基于TCP协议,用来发送电子邮件。
注意:接受邮件的协议不是STMP而是POP3协议。
电子邮件的发送过程?
比如我的邮箱是qq邮箱,我要写163邮箱发送邮件,整个过程可以简单分为下面几步:
1.通过SMTP协议,我们将我写好的邮件交给163邮箱服务器(邮局)
2.163邮件服务器发现我发送的邮箱是qq邮箱,然后它使用SMTP协议转发到qq邮箱服务器。
3.qq邮箱服务器接受邮件之后就通知qq邮箱的用户来收邮件,然后用户就通过POP3/IMAP协议将邮件取出。
如何判断邮箱是真正存在的?
很多场景我们需要判断发送的邮箱地址是否真正存在,这个时候我们可以利用SMTP协议来检测:
1.查找邮箱域名对应的SMTP服务器地址
2.尝试与服务器建立连接
3.连接成功后尝试向需要验证的邮箱发送邮件
4.根据返回的结果来判断邮件地址的真实性。
POP3/IMAP:邮件接收的协议
这两个协议没必要做多阐述,只需要了解POP3和IMAP两个都是负责邮件接收的协议即可。另外,需要注意不要将这两者和SMTP协议搞混淆了。STMP协议只负责邮件的发送,真正负责接收的协议是POP3/IMAP。
IMAP协议比POP3新一点,为用户提供的可选功能也更多一点,几乎所有现在电子邮件客户端和服务器都支持IMAP。大部分网络邮件服务提供商都支持POP3和IMAP。
FTP:文件传输协议
FTP协议主要是提供文件传输服务,基于TCP实现可靠的传输。使用FTP传输文件的好处是可以屏蔽操作系统和文件存储方式。
FTP是基于客户-服务器(C/S)模型而设计的,在客户端与FTP服务器之间建立两个连接。
FTP的独特的优势同时也与其他客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条TCP连接(其他客户端服务器程序一般只有一条TCP连接)
1.控制连接:用于传送控制信息
2.数据连接:用于数据传输
Telnet:远程登录协议
Telnet协议通过一个终端登录到其他服务器,建立在可靠的传输协议TCP之上。Telnet协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这就存在潜在的安全风险。这就是如今很少使用Telnet并被SSH的非常安全的协议取代的主要原因。
SSH:安全的网络传输协议
SSH(Secure Shell)是目前比较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄漏问题。SSH是建立在可靠的传输协议TCP之上的。
Telnet和SSH之间的主要区别在于SSH协议会对传输的数据进行加密保证数据的安全性。
DNS
TCP三次握手和四次挥手
为什么要三次握手?
三次握手的目的是建立可靠的通道通信,通信简单来说就是数据的发送和接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:客户端什么都不能确认;服务端确认客户端正常发送,服务端正常接收。
第二次握手:客户端确认客户端发送正常,接收正常;服务端发送正常,接收正常。
第三次握手:服务端确认服务端发送正常,客户端接收正常。
所以三次握手就能确认双方收发功能都正常,缺一不可。
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
第二次握手传回了ACK,为什么还要传回SYN?
SYN同步序列编号(Synchronize Sequence Numbers)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络时,客户机先发送出一个SYN消息,服务器使用SYN-ACK应答表示接受到了这个消息,最后客户机再使用ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才能在客户端和服务端之间传递。
接受端传回发送端所发送的ACK是为了告诉客户端,我们接受到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信。
1.4 三次握手过程中可以携带数据吗?
其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。
SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。
为什么要四次挥手
断开一个TCP连接则需要四次挥手:
客户端 发送一个FIN,用来关闭客户端到服务器的数据传输;
服务端 收到FIN,它发返回一个ACK发送给客户端(服务端可能还有数据需要传送);
服务端 关闭服务端到客户端的连接,发送FIN给客户端(服务端数据传输完成,发送数据告知客户端);
客户端 发送ACK报文确认(客户端发送信息,表示已经接收到关闭信息,通信正式关闭)
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入到半关闭状态。当另外一方也没有数据传送时,则发出连接释放的通知,对方确认后就完全关闭了TCP连接。
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。前两次挥手用于关闭一个方向的数据通道,后两次挥手用于关闭另一个数据通道。
TIME_WAIT状态需要保持2MSL.
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。
原因:(1)保证TCP协议的全双工连接能够可靠关闭;(2)保证这次连接的重复数据段从网络中消失
为什么最后一次握手报文要等待2MSL?保证A发送的最后一个确认报文段能够达到B。如果A不等待2MSL,若A返回的最后确认报文丢失,则B不能进入正常关闭状态,而此时A已经关闭,也不可能再重传。
TCP,UDP协议的区别
UDP在传送数据之前不需要建立连接,远地主机在收到报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式,比如:QQ语音,消息,直播等。
TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播。由于TCP提供可靠的,面向连接的传输服务(TCP的可靠体现在三次握手来建立连接,而且在数据传送数据时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约资源),这难免增加了许多开销,如确认,流量控制,计时器以及连接管理。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP一般用于文件传输、发送和接受邮件、远程登录等场景。
TCP协议如何保证可靠传输
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
ARQ 协议
自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
停止等待 ARQ 协议
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组。
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
优缺点:
- 优点: 简单
- 缺点: 信道利用率低,等待时间长
1) 无差错情况:
发送方发送分组, 接收方在规定时间内收到, 并且回复确认. 发送方再次发送。
2) 出现差错情况(超时重传):
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续 ARQ 协议 可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。
3) 确认丢失和确认迟到
- 确认丢失 :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。(不会认为已经发送过了,就不再发送。A 能重传,就证明 B 的确认消息丢失)。
- 确认迟到 :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。
连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优缺点:
- 优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
- 缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。
滑动窗口和流量控制
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
- 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
- 拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1。
- 快恢复:当发送方连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法,把慢开始门限ssthresh设置为此时发送方cwnd的一半。由于跳过了拥塞窗口cwnd从1起始的慢开始过程,所以被称为快恢复。
- 快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传超时计时器。
IP
IP为什么要分类
根据IP地址访问终端是通过路由器,路由设备当中有一张路由表,该路由表记录了所有IP地址的位置,这样就可以进行包的转发了,如果我们不区分网络地址,那么这张路由表当中就要保存所有IP地址的方向,这张路由表就会很大,就像下面说的那样:如果不分网络位和主机位,路由器的路由表就是都是32位的地址,那所有的路由器维护的路由表会很大,转发速度变慢(因为查询变慢)。而且所有的路由器都要全部Internet的地址,所有人的路由器都要有足够的性能存下来全网地址。
有了网络地址,就可以限定拥有相同网络地址的终端都在一个范围内,那么路由表只需要维护这个网络地址的方向,就可以找到相应的终端。
IPv4和IPv6的区别
解释一下IP地址、子网掩码、网关
IP地址
IP地址与硬件地址
IP地址是网络层使用的地址,它是分层次等级的。硬件地址是数据链路层使用的地址(MAC地址),它是平面的。在网络层以及网络层之上使用IP地址,IP地址放在IP数据报首部,而MAC地址放在MAC帧的首部。通过数据封装,把IP数据报分组封装为MAC帧后,数据链路层看不见数据报分组的IP地址。
由于路由器隔离,IP网络中无法通过广播MAC地址来完成跨网络的寻址,因此在网络层只使用IP地址来完成寻址。寻址时,每个路由器依据其路由表选择目标网络需要转发到下一跳,而IP分组通过多次路由转发到目标网络后,改为在目标LAN中通过数据链路层的MAC地址以广播方式寻址。
地址解析协议(ARP),每台主机都设有一个ARP高速缓存,用来存放本局域网上各主机和路由器的IP地址到MAC地址的映射表,称ARP表。
在浏览器中输入URL地址 ->> 显示主页的过程
上图中有一个错误 是OSPF不是OSFP。 OSPF(Open Shortest Path First,OSPF)开放最短路径优先协议,是由internet工程任务组开发的路由选择协议。
总体来说分为以下几个过程:
1.DNS解析
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接接受
HTTP是不保存状态的协议,如何保存用户状态
HTTP是一种不保存状态,即无状态(stateless)协议。也就是说HTTP协议自身不对请求和响应之间的通信状态进行保存。Session的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为HTTP协议是无状态的。服务端给特定的用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个Seesion,过了时间限制,就会销毁这个Session)。
在服务端保存Session的方法很多,最常用的就是内存和数据库(比如使用内存数据库Redis保存)。既然Session存放在服务器端,那么我们如何实现Session跟踪呢?大部分情况下,我们都是通过Cookie中附加一个Seeion ID 的方式来跟踪。
Cookie被禁用怎么办?
最常见的就是利用URL重写把Session ID直接附加在URL路径的后面。
Cookie的作用是什么?和Session有什么区别
cookie和session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
cookie一般用来保存用户信息比如1.我们在cookie中保存了已经登录的用户信息,下次访问这个网站的时候页面就可以自动帮你把登录的一些基本信息写了2.一般的网站都会有保持登录,也就是说下次你访问网站的时候就不用登录了,这是因为用户登录的时候我们存放了一个Token在cookie中,下次登录的时候只需要根据Token值来查找用户即可(为了安全考虑,重新登录一般要重写Token);3.登录一次网站后访问其他页面不需要重新登录。
session的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
Cookie数据存放在客户端(浏览器端),Session数据保存在服务器端。
Cookie存储在客户端中,而session存储在服务器上,相对来说Session安全性更高。如果要在Cookie中存储一些敏感信息,不要直接写入Cookie中,最好能将Cookie信息加密,然后使用到的时候在去服务端解密。
2.1、保存的位置不同
cookie保存在浏览器端,session保存在服务端。
2.2、使用方式不同
cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
2.3、存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
2.4、存储大小:``cookie最多可以存放4k大小的内容,session则没有限制。
2.5、session的安全性要高于cooKie
2.6、cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录
session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
2.7、session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。
URL和URI的区别是什么?
URI(Uniform Resource Identifier)是统一资源标识符,可以唯一标识一个资源。
URL(Uniform Resource Locator)是统一资源定位符,可以提供该资源的路径。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅标识唯一资源,而且还提供了定位该资源信息。
OSI和TCP/IP 网络分层模型详解
OSI七层模型
物理层:物理层的传输单位是比特,功能是在物理媒体上为数据端设备透明地传输原始比特流。通信链路与通信结点的连接需要一些电路接口,物理层规定了这些接口的一些参数,如机械形状和尺寸、交换电路的数量和排列等。
物理层设备:中继器的主要功能是将信号整形并放大再转发出去,以消除信号经过一长段电缆后而产生的失真和衰减,使信号的波形和强度达到所需要的要求,进而扩大网络传输的距离。其原理是信号再生(而非简单地将衰减地信号放大)。中继器有两个端口,一个输入端口一个输出端口。
集线器(Hub)实质上是一个多端口中继器。Hub的每个端口连接的网络部分是一个网络的不同网段,同时Hub也只能在半双工状态下工作,网络的吞吐率因而受到限制。
数据链路层:传输单位是帧,任务是将网络层传来的IP数据报组装成帧。数据链路层的功能可以概况为成帧、差错控制(由于外界的干扰,原始的物理连接在传输比特流时可能发生错误)、点到点的流量控制和传输管理。典型协议SDLC、HDLC、PPP。
差错控制:检错编码(奇偶校验码、循环冗余码),纠错编码(海明码)
流量控制:滑动窗口,自动重传请求(Automatic Repeat reQuest,ARQ),停止-等待协议、后退N帧协议、选择重传协议
数据链路层设备:网桥,两个或多个以太网通过网桥连接后,就成为一个覆盖范围更大的以太网,而原来的每个以太网就称为一个网段。网桥工作在链路层的MAC子层,可以使以太网各网段成为隔离开的冲突于。局域网交换机,又称以太网交换机,以太网交换机实质上就是一个多端口的网桥,它工作在数据链路层。以太网交换机的每个端口都直接与单台主机或另一个交换机相连,通常都工作在全双工方式。交换机能经济地将网络分成小的冲突域,为每个工作站提供更高的宽带。
网络层:网络层的传输单位是数据报,它关心的是通信子网的运行控制,主要任务是把网络层的协议数据单元分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。关键问题是对于分组进行路由选择,并实现流量控制、拥塞控制、差错控制和网际互连等功能。典型协议IP、ICMP、ARP、OSPF等。
路由器主要完成两个功能:一是路由选择(确定哪一条路径),二是分组转发(当一个分组到达时所采取的动作)。前者是根据特定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。后者处理通过路由器的数据流,关键操作是转发表查询、转发及相关的队列管理和任务调度等。(1)路由选择,指按照复杂的分布式算法,根据从各相邻路由器所得到的关于整个网络拓扑的变化,动态地改变所选择的路由;(2)分组转发,指路由器根据转发表将用户用户的IP数据报从合适的端口号转发出去。
路由表是根据路由选择算法得出的,而转发表是从路由表得出的。转发表的结构应当使找过程最优化,路由表则需要对网络拓扑变化的计算最优化。在讨论路由选择时,往往不去区分转发表和路由表,而笼统地使用路由表一词。
网络地址转换(NAT)是指通过将专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址。
网络层设备:路由器是一种具有多个输出/输入端口的专用计算机,其任务是连接不同的网络(连接异构网络)。在多个广播域互连时必须使用路由器。当源主机要向目标主机发送数据报时,路由器先检查源主机与目标主机是否连接在同一个网络上,那么路由器按照转发表指出的路由将数据报转发给下一个路由器,这称为间接交付。可见,在同一个网络中传输数据无须路由器参与,而跨网络通信必须通过路由器进行转发。
传输层:传输层的传输单位是报文段(TCP)或用户数据报(UDP),传输层负责主机中两个进程之间的通信,功能是为端到端提供可靠的传输服务,为端到端提供连接提供流量控制、差错控制、服务质量、数据传输管理服务等。典型协议TCP、UDP
数据链路层提供点到点的通信,传输层提供的是端到端的通信,两者不同。通俗的说,点到点可以理解为主机到主机的通信,一个点是指一个硬件地址或IP地址,网络中参与通信的主机是通过硬件地址或IP地址来标识的;端到端的通信是指运行在不同主机的两个进程之间的通信,一个进程由一个端口来标识。
传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱和重复),传输层同样能为应用程序提供可靠的服务。
传输层功能:(1)提供应用进程之间的逻辑通信;(2)分用和复用。复用是指发送方不同的应用进程都可使用同一个传输协议传输数据。分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。(3)差错检测,网络层只检测IP数据报的首部;(4)提供两种协议,面向连接的TCP和无连接的UDP。
IP地址和MAC地址标识的是主机,端口标识的是主机的应用进程。
数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口。
会话层:负责主机之间的会话进程,包括建立、管理以及终止进程间的会话。
表示层:数据压缩、加密和解密。
应用层:应用层是是用户与网络的界面。应用层为特定的网络类型应用提供访问OSI参考模型环境的手段。典型协议FTP、SMTP、HTTP
TCP/IP模型
网络接口层(物理层+数据链路层)、网际层(网络层)、传输层、应用层(会话层+表示层+应用层)
为什么要网络分层?
1.各层之间相互独立:各层直接相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
2.提高了整体灵活性:每一层都可以使用最合适的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则有没有改变就行。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则上也是可以对应的。
3.大问题化小:分成可以将复杂的网络间的问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界定义。
HTTP VS HTTPS(应用层)
HTTP协议
HTTP协议,全称超文本传输协议(Hypertext Transfer Protocol)。顾名思义,HTTP协议就是用来规范超文本的传输,超文本也就是网络上的包括文本在内的各式各样的消息,具体来说,主要是规范浏览器和服务器端的行为的。
并且,HTTP是一个无状态协议,也就是说服务器不维护任何有关客户端过去所发请求的消息。这其实是一种懒政,有状态的协议会更加复杂,需要维护状态(历史信息),而且如果客户或服务器失效,会产生状态的不一致,解决这种不一致的代价更高。
HTTP协议通信过程
HTTP是应用层协议,它以TCP(传输层)作为底层协议,默认端口为80。通信过程主要如下:
1.服务器在80端口等待客户的请求;
2.浏览器发起到服务器的TCP连接(创建套接字Socket);
3.服务器接收来自浏览器的TCP连接;
4.浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP消息;
5.关闭TCP连接。
优点:
扩展性强、速度快、跨平台支持性好
HTTPS协议
HTTPS协议(Hyper Text Transfer Protocol Secure),是HTTP的加强安全版本。HTTPS是基于HTTP的,也是用TCP作为底层协议,并额外使用SSL/TLS协议用做加密和安全认证。默认端口号是443.
HTTPS协议中,SSL通道通常使用基于密钥的加密算法,密钥长度通常是40比特或128比特。
优点:保密性好、信任度高
SSL和TLS的区别?
SSL 指安全套接字协议(Secure Sockets Layer),首次发布与 1996 年。SSL 的首次发布其实已经是他的 3.0 版本,SSL 1.0 从未面世,SSL 2.0 则具有较大的缺陷(DROWN 缺陷——Decrypting RSA with Obsolete and Weakened eNcryption)。很快,在 1999 年,SSL 3.0 进一步升级,新版本被命名为 TLS 1.0。因此,TLS 是基于 SSL 之上的,但由于习惯叫法,通常把 HTTPS 中的核心加密协议混成为 SSL/TLS。
HTTP1.0 VS HTTP1.1
1.连接方式:HTTP1.0为短连接,默认使用短连接,客户端和服务器每次进行一次HTTP操作,就建立一次连接,任务结束就中断连接,当客户端浏览器访问的某个HTML或者其他类型的Web页中包含有其他的资源,每遇到一个Web资源,浏览器就会重新建立一个TCP连接,这样就会导致有大量的握手报文和挥手报文占用了带宽。
HTTP1.1支持长连接,TCP连接将持续打开,为后续客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器端用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
1.0与1.1都支持短连接和长连接,只是默认的不一样。
2.状态响应码:HTTP/1.1中加入了大量的状态码,光是错误响应码就新增了24种。
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.这样就方便了开发者自由的选择以便于充分利用带宽和连接。
5.Host头处理,HTTP1.1在请求头中加入了Host字段。
HTTP常见状态码(应用层)
1xx Informational 信息性状态码
2xx Success 成功状态码
- 200 OK :请求被成功处理。比如我们发送一个查询用户数据的HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
- 201 Created :请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
- 202 Accepted :服务端已经接收到了请求,但是还未处理。
- 204 No Content : 服务端已经成功处理了请求,但是没有返回任何内容。
3xx Redirection 重定向状态码
- 301 Moved Permanently : 资源被永久重定向了。比如你的网站的网址更换了。
- 302 Found :资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
4xx Client Error 客户端错误状态码
- 400 Bad Request : 发送的HTTP请求存在问题。比如请求参数不合法、请求方法错误。
- 401 Unauthorized : 未认证却请求需要认证之后才能访问的资源。
- 403 Forbidden :直接拒绝HTTP请求,不处理。一般用来针对非法请求。
- 404 Not Found : 你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
- 409 Conflict : 表示请求的资源与服务端当前的存状态在冲突,请求无法被处理。
5xx Server Error 服务器错误状态码
- 500 Internal Server Error : 服务端出问题了(通常是服务端出Bug了)。比如你服务端处理请求的时候突然抛出异常,但是异常并为在服务端被正确处理。
- 502 Bad Gateway :我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。
重定向与请求转发
请求转发
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定他去执行,当这个servlet执行完之后,他要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里完成,因此servlet和jsp共享的是同一个request请求,在servlet里面放的所有东西,在student_list中都能取出来。整个过程一个请求,一个响应。
重定向
请求转发与重定向二者区别
单工、双工、半双工的通信方式
单工:数据传输只支持数据在一个方向上传输,在同一时间只有一方能接受或发送信息,不能实现双向通信。例如,电视,广播
半双工:半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;同一时间只可以有一方接收或发送信息,可以实现双向通信。例如,对讲机。
双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接收和发送信息。例如,电话通信。