面试中常被问到的计算机网络.
主要是以网络上流传的面试题为主
OSI,TCP/IP,五层协议的体系结构
请简单说一下你了解的端口及对应的服务
TCP UDP的区别
TCP UDP对应的协议
TCP协议首部格式
TCP的三次握手和四次挥手
IP地址的分类
ARP协议的工作原理
IP层转发分组的流程
子网掩码的作用
请简单说一下你了解的端口及对应的服务?
常见的路由选择协议,以及它们的区别
浏览器中输入www.baidu.com后执行的全部过程
HTTP
(1)HTTP通信过程
(2)请求和响应
(3)状态码
(4) HTTP/1.0和HTTP/1.1
(5)HTTP和HTTPS
POST和GET的区别
OSI,TCP/IP,五层协议的体系结构
OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。
五层协议(5层):物理层、数据链路层、网络层、运输层、应用层。
各层对应的作用和对应的协议
image.pngTCP/IP中,每一层对应的协议
网络层:IP协议、ICMP协议、ARP协议、RARP协议。
传输层:UDP协议、TCP协议。
应用层:FTP(文件传送协议)、Telenet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议。
TCP UDP的区别
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
两者的区别大致如下:
TCP面向连接,UDP面向非连接即发送数据前不需要建立链接
TCP提供可靠的服务(数据传输),UDP无法保证
TCP面向字节流,UDP面向报文
TCP数据传输慢,UDP数据传输快
TCP首部开销20字节;UDP的首部开销小,只有8个字节
如果还不是太了解这两者的区别,点击阅读:TCP与UDP的区别 - yipiankongbai的专栏
TCP的可靠性如何保证:
在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列之中,同时启动时钟。其后,如果收到了接受端对该段的ACK信息,就将该段从队列中删去。如果在时钟规定的时间内,ACK未返回,那么就从发送队列中再次送出这个段。TCP在协议中就对数据可靠传输做了保障,握手与断开都需要通讯双方确认,数据传输也需要双方确认成功,在协议中还规定了:分包、重组、重传等规则;而UDP主要是面向不可靠连接的,不能保证数据正确到达目的地。
TCP的可靠传输分为
停止等待协议:“ 停止等待”就是每发送完一个分组就停止发送,等待对方确认
连续ARQ协议:接收方不必对收到的分组逐个确认,而是在收到几个分组后,对按顺序到达的最后一个分组发送确认。
TCP协议首部格式
image.png挑几个重要的部分进行讲解
序号:首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
确认号:是期待收到对方下一个报文段的第一个数据字节的序号
既是收到的对方的序号加上传输数据的长度。
确认ACK:控制确认号字段是否有效,当ACK=1时确认号才有效,ACK为0确认号无效,在连接建立后所有传送的报文字段都必须把ACK置1。
同步SYN :在连接建立时用来同步序号,SYN置为1就表示是一个连接请求或连接接收报文。
终止FIN:用来释放一个连接,当FIN置为1时,表达此报文段的发送方的数据已发送完毕。
窗口:窗口值作为接收方让发送方设置其发送窗口的值,可以进行流控。
有了这个基础我们来看TCP的三次握手和四次挥手吧,
TCP的三次握手和四次挥手
TCP的三次握手
image.png其中SYN是建立连接的同步序号,大写的ACK是确认ACK(为了方便,当做传的数据长度都为1),小写的ack是确认号,seq为序号,
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,seq为x;然后,客户端进入SYN_SEND(同步已发送)状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置ack为x+1(seq+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,确认ACK位置为1,seq为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV(同步收到)状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将ack设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和进入ESTABLISHED(已建立连接)状态,
服务器端收到确认后,也进入ESTABLISHED(已建立连接)状态
完成TCP三次握手。
为什么一定要三次握手?
其实三次握手主要是看一下端之间的通路是否双向都通,主要的一种情况是已失效的连接请求又传到了服务器端,举个例子,A向B发送连接请求,但是在某些网络点长时间滞留了,以致延误到连接释放以后的某个时间才到达B,B收到后,就误认为A又发了一次新的连接请求,就会想A发起确认,如果不采取三次握手,即A不对收到B的请求进行确认的话,B在发送请求,连接就会建立了,而A现在并没有向B发送请求(请求四之前滞留的),因此不会理睬B的确认,而B却以为连接已经建立,就一直在等,B的很多资源就这样浪费了。
TCP的四次挥手
image.png其中FIN用来释放一个连接,SYN是建立连接的同步序号,大写的ACK是确认ACK,小写的ack是确认号(为了方便,当做传的数据长度都为1),seq为序号。
第一次挥手:主机A(可以使客户端,也可以是服务器端),设置seq和ack,向主机B发送一个FIN(为1)报文段;此时,主机1进入FIN_WAIT_1(终止等待1)状态;这表示主机A没有数据要发送给主机B了;
第二次挥手:主机A收到了主机B发送的FIN报文段,进入CLOSE-WAIT(关闭等待)向主机A回一个ACK报文段,ack为seq加1;主机A收到B的确认后,主机A进入FIN_WAIT_2状态(终止等待2);主机B告诉主机A,我“同意”你的关闭请求;
第三次挥手:主机B向主机A发送FIN报文段,请求关闭连接,同时主机B进入LAST_ACK(最后确认)状态;
第四次挥手:主机A收到主机B发送的FIN报文段,向主机B发送ACK报文段,然后主机A进入TIME_WAIT( 时间等待)状态;主机B收到主机1的ACK报文段以后,就关闭连接;此时,主机A等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机A也可以关闭连接了。
为什么要等待2MLS
1.为了保证A发送的最后一个ACK报文能够到达B,ACK报文可能丢失,因此B不会收到确认,因此B会重传FIN报文,设置等待2MLS就可以收到重传的FIN报文,再重新确认。
2.防止“已失效的连接请求报文段”。A在发送完最后一个ACK报文段后,再经过2MLS,就可以使本连接持续的时间内所产生的所有报文段都从网络消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
为什么要四次握手?
当主机A发出FIN报文段时,只是表示主机A已经没有数据要发送了,主机A告诉主机B,它的数据已经全部发送完毕了;但是,这个时候主机A还是可以接受来自主机B的数据;当主机B马上返回ACK报文段时,表示它已经知道主机A没有数据发送了,但是主机B还是可以发送数据到主机A的;如果主机B要发送的数据没发完,主机B还不能断开连接,因此,ACK和FIN不能一起发给主机B,因此需要4次握手。
更加深入的了解TCP的三次握手与四次分手:简析TCP的三次握手与四次分手
TCP对应的协议和UDP对应的协议
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。
(2) Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。
(3) SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
(5)HTTP协议:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
请简单说一下你了解的端口及对应的服务?
image.pngIP地址的分类
image.png image.png所有类别的地址的主机地址部分都不能为全0或全1,
主机地址部分全0 表示“本主机”所连接到的单个网络地址
主机地址部分 全1表示网络上的所有主机 也就广播地址。
A类地址特殊的网络号 :
网络号全0是保留地址,表示“本网络”
网络号为127(即 011111111)保留作为环回测试地址。
B类地址特殊的网络号 :
网络号为128.0是不可以指派的
C类地址特殊的网络号 :
网络号为192.0.0是不可以指派的
255.255.255.255 该IP地址指的是受限的广播地址。
0.0.0.0 常用于寻找自己的IP地址,
ARP协议的工作原理
首先来看一下ip地址和硬件地址的关系
image.png
那么, ARP协议是做什么的呢?
ARP协议是解决同一个局域网上的主机或路由器的IP地址和硬件地址之间的映射问题。
ARP协议的工作原理
首先,每台主机都会在自己的ARP缓冲区中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。 image.pngIP层转发分组的流程
首先看一下数据在各层之间的流动
image.png由此图可以看出,当路由器收到待转发的数据报,得到目的IP地址,从路由器中得到下一跳路由器的IP地址后,将下一跳的IP地址使用ARP转换为硬件地址,并将硬件地址放在链路层的MAC帧的首部,然后根据硬件地址找到下一跳路由器。
具体的转发流程
image.png
划分子网的情况下转发的流程
image.png子网掩码的作用
子网掩码其实是为了分割网络,比如一个A类地址能容纳的主机数有2^24-2个主机,一般一个组织是不可能用到这么多地址的,势必会造成浪费。但是我们可以通过子网掩码来将一个A类地址划分成多个子网,根据IP和子网掩码可以判断同一个网络地址下的主机是否在同一个网段.
计算方法示例:
定义子网掩码的步骤为:
A、确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c类IP地址,网络标识为“210.73.a”,主机标识为“b”。
B、根据我们所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们需要12个子网,将来可能需要16个。2的4次方为16,用第四个字节的前四位确定子网掩码。前四位都置为“1”,即第四个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
C、把对应初始网络的各个位都置为“1”,即前三个字节都置为“1”,则子网掩码的间断二进制形式为:“11111111.11111111.11111111.11110000” 。
D、把这个数转化为间断十进制形式为:“255.255.255.240” 。
常见的路由选择协议,以及它们的区别
常见的路由选择协议有:RIP协议、OSPF协议。
RIP协议:底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包。
OSPF协议:底层是迪杰斯特拉算法(最短路径优先),是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。
重点说一下RIP协议 他是基于距离向量的路由选择协议,他规定只能和相邻的路由器交换信息,交换的信息是本路由器所知道的全部信息,按固定的时间间隔交换信息
image.pngOSPF是向本系统的所有路由器发送信息,发送的信息是与本路由器相邻的所有路由器的链路状态,只有当链路状态发生改变时,路由器才会向所有路由器发送信息。
浏览器中输入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数据包到达服务器的地址。
HTTP
HTTP全称为超文本传输协议
HTTP是无状态的,无连接的,它使用的是面向连接的TCP作为传输层的协议.
每个服务器都有一个服务器进程,不断的监听80端口,来发现是否有浏览器对其发出请求。一旦监听到连接请求就建立TCP连接,浏览器就向服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,传输完毕后TCP连接就被释放了。在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的格式。这些格式和规则就是超文本传输协议HTTP。
HTTP通信过程大致如下:
image.png请求数据:
image.png
Http请求方法:
GET 请求获取由 Request-URI 所标识的资源。
POST 在 Request-URI 所标识的资源后附加新的数据。
HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头。
OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。
PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识。
DELETE 请求服务器删除由 Request-URI 所标识的资源。
TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。
响应数据:
image.png
HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
301 //永久重定向
302 //临时重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更具体的讲解
http://www.cnblogs.com/ranyonsue/p/5984001.html
http://www.studyofnet.com/news/166.html
HTTP/1.0和HTTP/1.1
HTTP/1.0的主要缺点,就是每请求一个文档就要有两倍RTT(一个RTT用于连接TCP连接,一个用于请求和接收万维网)的开销。若主页上有很多连接的对象(如图片等)需要一次进行链接,那么每一次链接下载都要导致2RTT的开销。
HTTP/1.1协议较好的解决了这个问题。他使用的是持续连接,也就是服务器在发送响应后,仍然在一段时间内保持这条连接,使同一个用户可以继续在这条连接上传送后续的HTTP请求报文和响应报文。
HTTP和HTTPS
HTTPS全称为安全超文本传输协议,是以安全为目标的HTTP通道,。即HTTP下加入SSL(安全套接层)层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS = HTTP + SSL
HTTPS握手过程:
客户端产生一个对称的密钥,通过服务器的CA证书进行交换(CA证书实质上是一个公钥,客户端用公钥加密生成的对称秘钥,将加密信息传递,服务器用私钥进行解密获得客户端生成的对称密钥,双方之后通过对称密钥来进行加密传输)。
接下来所有的信息往来就都是加密的。被第三方截获因为没有加密使用的密钥,便无法解密,更无法篡改。
HTTP和HTTPS的区别
一、HTTPS协议需要到ca申请证书。
二、HTTP是超文本传输协议,信息是明文传输,https 则是具有安全性的SSL加密传输协议。
三、HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
HTTP和HTTPS和SSL更具体的讲解 http://www.jianshu.com/p/3863bf9fe93e
POST 和 GET的区别
image.png1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
3.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
4.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。