面试题——计算机网络
HTTP协议的持续连接和非持续连接:
在使用HTTP/1.0的情况下,如果打开一个包含一个HTML文件和10个内联图象对象的网页时,HTTP就要建立11次TCP连接才能把文件从服务机传送到客户机。而使用HTTP/1.1的情况下,如果打开同样的文件时,HTTP建立一次TCP连接就可把文件从服务机传送到客户机。使用一次TCP连接传送一个对象的效率比较低,这体现在下列几个方面:
(1) 每次TCP连接必需要建立和断开。客户机和服务机建立一次连接需要执行三次握手,服务机在对象递送之后要断开TCP连接。在建立和断开连接时要占用CPU的资源。如果使用一次连接代替11次连接的话,占用客户机和服务机的CPU时间可大大减少。
(2) 对每次连接,客户机和服务机都必须分配发送和接收缓存。这就意味着要影响客户机和服务机的存储器资源,这同样要占用CPU的时间。
(3) 对由大数量对象组成的文件,TCP的慢启动算法会限制服务机向客户机传送对象的速度。使用HTTP/1.1之后,大多数对象都可以尽最大的速率传送。
Http协议报文格式:
HyperText Transfer Tansfer Protocol 超文本传输协议,是一种基于TCP的应用层协议,也是目前为止最为流行的应用层协议之一,
HTTP请求报文格式:
HTTP响应报文格式:
请求方式Method:
1)GET方法意思是获取URL指定的资源,这个请求方式是最简单的也是最常用的。使用GET方法时,可以将请求参数和对应的值附加在 URI 后面,利用一个问号(“?”)将资源的URI和请求参数隔开,参数之间使用与符号(“&”)隔开,因此传递参数长度也受到了限制,而且与隐私相关的信息也直接暴露在URI中。比如/index.jsp?username=holmofy&password=123123
2)POST 方法一般用提交信息或数据,请求服务器进行处理(例如提交表单或者上传文件)。表单使用POST相对GET来说还是比较隐秘的,而且GET的URL有长度限制,而上传大文件就必须要使用POST了。
3)HEAD 方法与GET用法相同,但没有响应体,使用场合没有GET多。比如下载前使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段来判断本地缓存资源是否要更新。
4)OPTIONS方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法。
5)PUT:用于向指定资源位置上传其最新内容(原来没有就上传,有就上传并覆盖原来的内容)
6)DELETE:请求服务器删除Request-URI所标识的资源。
7)TRACE:回显服务器收到的请求,主要用于测试或诊断。比较少见。
8)CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
HTTP响应码:
HTTP协议中状态码有三位数字组成,第一位数字定义了响应的类别,有以下五种:
-
1XX:信息提示。表示请求已被服务器接受,但需要继续处理,范围为100~101。
-
2XX:请求成功。服务器成功处理了请求。范围为200~206。
-
3XX:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300~305。
-
4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或者请求了一个不存在的资源。范围为400~415。
-
5XX:服务器出错。客户端发送了有效的请求,但是服务器自身出现错误,比如Web程序运行出错。范围是500~505。
常见的状态码务必要熟悉:
200:客户端请求成功。
302:重定向。
404:请求资源不存在。
400:请求语法错误,服务器无法理解。
403:服务器收到请求,但拒绝提供服务。
500:服务器内部错误。
503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。
cookie 和session 的区别:
-
存储方式不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。
-
session机制可能需要借助于cookie机制来达到保存标识的目的
-
隐私策略不同:cookie存储在客户端阅读器中,对客户端是可见的,而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
-
服务器压力不同:session会在一定时间内保存在服务器上。假如设置Session的超时时间过长,当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
-
单个cookie保存的数据不能超过4K。
-
跨域支持上的不同:cookie支持跨域名访问,而session不会支持跨域名访问。
-
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类。
如果cookie被禁用了,怎么办?
通常情况下 Cookie 里记录了 Session 的 id ,所有 Cookie 被禁用了也就意味着 Session 失效了。不过 Session id 还有另外一种传递方式,就是在 URL 查询中携带 Session id (既把所有的URL里都带上Session id的参数,如: http://xxx/index?sid=...)。不够这种方法比较麻烦(所有的链接都要带上),而且比较容易丢失 Session id(地址可以认为修改去掉ID),所有只是作为备选方案,在 Cookie 不能使用的环境下可以作为替代。
跨域访问问题:
随着项目模块越来越多,很多模块现在都是独立部署。模块之间的交流有时可能会通过cookie来完成。比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入cookie(记录着用户上下文信息),应用想要获取门户下的cookie,这就产生了cookie跨域的问题。
cookie一般都是由于用户访问页面而被创建的,可是并不是只有在创建cookie的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
Web缓存:
Web缓存器也叫代理服务器,代表初始Web服务器来满足HTTP请求。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求的副本。可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器。
-
浏览器建立一个到web缓存器的tcp连接,并向web缓存器中的对象发送一个HTTP请求
-
web缓存器检查本地是否存储了该对象的拷贝,如果有,用HTTP响应报文向客户浏览器返回该对象
-
如果没有,web缓存器与该对象的初始服务器打开一个TCP连接,并发送该对象的HTTP请求
-
web缓存器接受到初始服务器返回的对象后,在本地存储空间存储一份拷贝,并用HTTP响应报文向客户浏览器返回该拷贝(通过已经建立在客户机浏览器和web缓存器之间的TCP连接)。
TCP对应的协议和UDP对应的协议:
-
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
-
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
域名服务器:
-
根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。
-
顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
-
权限域名服务器:负责一个“区”的域名服务器。
-
本地域名服务器:当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
域名的解析过程:
一、主机向本地域名服务器的查询一般都是采用递归查询:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
二、本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
UDP报文段:
-
源端口(2字节):源端口号。在需要对方回信时选用。不需要时可用全0;
-
目的端口(2字节):目的端口号。这在终点交付报文时必须要使用到;
-
长度(2字节): UDP用户数据报的长度,其最小值是8(仅有首部);
-
校验和(2字节):检测UDP用户数据报在传输中是否有错。有错就丢弃。
TCP报文段:
-
源端口:源端口和IP地址的作用是标识报文的返回地址。
-
目的端口:端口指明接收方计算机上的应用程序接口。
-
序号:序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。假设一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
-
确认序号:即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
-
数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
-
保留:为将来定义新的用途保留,现在一般置0。
-
控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
-
窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
-
校验和:奇偶校验,此校验和是对整个的TCP 报文段,包括TCP头部和TCP数据,以16位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
-
紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。
-
选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
-
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
三次握手与四次挥手:
OSI模型及其协议:
OSI七层网络模型 |
TCP/IP四层概念模型 |
功能 |
对应网络协议 |
应用层(Application) |
应用层 |
文件传输,电子邮件,文件服务,虚拟终端 |
HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) |
数据格式化,代码转换,数据加密 |
Telnet, Rlogin, SNMP, Gopher |
|
会话层(Session) |
解除或建立与别的接点的联系 |
SMTP, DNS |
|
传输层(Transport) |
传输层 |
提供端对端的接口 |
TCP, UDP |
网络层(Network) |
网络层 |
为数据包选择路由 |
IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) |
数据链路层 |
传输有地址的帧以及错误检测功能 |
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) |
以二进制数据形式在物理媒体上传输数据 |
IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
IP报文格式:
-
版本:IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
-
首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111。
-
服务类型:Type Of Service。
-
总长度:IP报文的总长度。报头的长度和数据部分的长度之和。
-
标识:唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
-
标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
-
片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8)
-
生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。
-
协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
-
首部校验和:计算IP头部的校验和,检查IP报头的完整性。
-
源IP地址:标识IP数据报的源端设备。
-
目的IP地址:标识IP数据报的目的地址。
IP地址的划分:
IP地址是一个32位的标识符,我们将IP地址划分为若干个固定类,每一类地址都是由两个固定长度的字段组成,其中第一个字段是网络号,标志主机连接到的网络,第二个是主机号,一个IP地址在整个Internet上是唯一的。
常用的地址是A,B,C三类地址,通过它们的位数设置,我们可以得出这几类地址表示的范围:
其中还有一些特殊的IP地址,在特定情况下使用:
TCP 协议如何保证可靠传输:
-
确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。
-
数据校验
-
数据合理分片和排序:tcp会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。
-
流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
-
拥塞控制:当网络拥塞时,减少数据的发送。
流量控制:
简单来说就是接收方处理不过来的时候,就把窗口缩小,并把窗口值告诉发送端。
滑动窗口:
接收窗口:
发送窗口:
拥塞控制:
Http与Https的区别:
-
HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
-
HTTP 是不安全的,而 HTTPS 是安全的
-
HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
-
在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
-
HTTP 无法加密,而HTTPS 对传输的数据进行加密
-
HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书
HTTPS工作原理:
HTTPS其实是有两部分组成:HTTP + SSL / TLS,
也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据
1. 客户端发起HTTPS请求:就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2. 服务端的配置:采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。(可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。)
3. 传送证书:这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书:这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5. 传送加密信息:这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息:服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息:这部分信息是服务段用私钥加密后的信息,可以在客户端被还原
8. 客户端解密信息:客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。
交换机和路由器的区别:
-
工作层次不同:交换机工作在OSI模型中的数据链路层,工作原理简单;路由器工作在OSI模型中的网络层,得更多协议信息,做更智能的转发决策
-
数据转发所依据的对象不同:交换机是利用物理地址(MAC地址),确定转发的目的地址(MAC固化硬件,一般不可更改);路由器是利用IP地址,确定转发的目的地址(IP通常为网关或系统自动分配的)
-
是否可以分割广播域:交换机可以分割冲突域,不能分割广播域,而路由器可以分割广播域
-
路由器提供了防火墙的服务:路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包,不传送未知目标网络数据包,从而可以防止广播风暴
-
表:二层交换机上存在MAC表,三层交换机上存在路由表、MAC表、ARP表,路由器上存在路由表和ARP表。
ARP工作原理:
-
每个主机都会在自己的ARP 缓冲区中建立一个ARP 列表,以表示IP 地址和MAC 地址之间的对应关系。
-
主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等),会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
-
网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
-
某个主机需要发送报文时,首先检查ARP列表中是否有对应IP 地址的目的主机的MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP 数据包,该数据包包括的内容有:源主机IP地址,源主机MAC 地址,目的主机的IP 地址等。
-
当本网络的所有主机收到该ARP 数据包时:
-
首先检查数据包中的IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。
-
如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中如果已经存在,则覆盖。
-
然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
-
源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。