计算机网络常见面试题

1. 什么是TCP?

TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠字节流服务,也就是说,在收发数据前,必须和对方建立可靠的连接。这一过程和打电话类似:先拨号振铃,等待对方接电话,说喂,再说自己是谁。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的传输层。

 

面向有连接

2. 什么是UDP?

UDP (User Datagram Protocol,用户数据报协议),是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种非连接传输层协议,提供面向事务的简单不可靠信息传送服务,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上,故也不安全

 

面向无连接

3.请简述TCP/UDP的区别

  • 1、TCP基于连接,而UDP基于无连接的; 
  • 2、对系统资源的要求:TCP较多(TCP有20个字节信息包),UDP(UDP信息包只有8个字节); 
  • 3、UDP程序结构较简单; 
  • 4、TCP是字节流模式,而UDP是数据报文模式 ;
  • 5、TCP保证数据正确性,安全可靠,并且保证数据顺序,而UDP可能丢包,而且UDP不保证数据顺序

4、TCP与UDP应用

TCP一般用于文件传输,发送或接收邮件,远程登录 等。

UDP一般用于及即时通信,在线视频,网络语音电话 等。

基于TCP的协议:HTTP、FTP、SMTP

基于UDP的协议:RIP、DNS、SNMP

5.TCP的三次握手,四次挥手过程

三次握手之所以是三次是保证client和server均让对方知道自己的接收和发送能力没问题而保证的最小次数。

第一次client => server     只能server判断出client具备发送能力
第二次 server => client    client就可以判断出server具备发送和接受能力。此时client还需让server知道自己接收能力没问题于是就有了第三次
第三次 client => server     双方均保证了自己的接收和发送能力没有问题

其中,为了保证后续的握手是为了应答上一个握手,每次握手都会带一个标识 seq,后续的ACK都会对这个seq进行加一来进行确认。

三次握手讲解

  1. 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)
  2. 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)
  3. 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)

为什么http建立连接需要三次握手,不是两次或四次?

答:三次是最少的安全次数,两次不安全,四次浪费资源

TCP关闭连接过程

  1. Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。

  2. Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态(等待关闭),此后Server不能再读取数据,但可以继续向Client发送数据。

  3. Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。

  4. Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。

  5. Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态(为了解决网络丢包和网络不稳定所带来的其他问题,确保连接方能在时间范围内关闭自己的连接),接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。为什么四次挥手释放连接时需要等待2MSL? 答:MSL即报文最大生成时间,设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。为什么TIME_WAIT过多?解决方法是怎样的?可能原因:高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。解决:负载均衡服务器;Web服务器首先关闭来自负载均衡服务器的连接

  6. Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

为什么要四次挥手?

TCP是全双工信道,何为全双工就是客户端与服务端建立两条通道,

  • 通道1:客户端的输出连接服务端的输入;
  • 通道2:客户端的输入连接服务端的输出。

两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通道的时候就是这样:

客户端:我要关闭输入通道了。
服务端:好的,你关闭吧,我这边也关闭这个通道。

服务端:我也要关闭输入通道了。
客户端:好的你关闭吧,我也把这个通道关闭。

三次握手过程中可以携带数据吗?

第三次握手时可以携带数据,第一次第二次不行。

原因:设想这样的场景,若第一次握手可以携带数据,有人要恶意攻击服务器,则他每次都可以在第一次握手中的SYN报文中放入大量数据,会让服务器花费很多时间和空间来处理报文。

也就是说,第一次握手无法放数据,保证了服务器的安全性。而第三次握手时,已经代表成功的建立了连接,从客户端携带数据到服务器也是被理解的。

SYN攻击是什么?

概念:Client在短时间伪造大量不存在的ip地址,向Server不断发送SYN包,Server则回复确认包,并等待Client确认,这些包将长时间占用未连接队列,导致其他正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪(Dos/DDoS攻击)。

如何检测:当看到大量半连接状态,且源地址IP为随机时,即可断定位一次SYN攻击(Linux中的netstat命令)。

解决办法:缩短SYN包的过期时间,过滤网关防护,防火墙等等。

6.TCP可靠传输的保证

TCP通过应用数据分割、对数据包进行编号、校验和、流量控制、拥堵控制、ARP协议、超时重传等措施保证数据的可靠传输。

TCP的流量控制

一般来说,我们总是希望数据传输的更快一些,但如果发放方把数据发送的过快,接收方就有可能来不及接收,这就会造成数据的丢失。

所谓的流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。

利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。

  • TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小。
  • TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文。

TCP的拥塞控制

目的:为了防止过多的数据注入到网络中,避免网络中的路由器、链路过载

https://blog.csdn.net/qq_41431406/article/details/97926927

视频:https://www.bilibili.com/video/BV1c4411d7jb?p=61

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞

在计算机网络中数位链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。

出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降

 TCP的四种拥塞控制算法
1.慢开始
2.拥塞避免
3.快重传
4.快恢复

 

7.在浏览器输入网址之后执行会发生什么?

先检查输入的URL是否合法,然后查询浏览器的缓存,如果有则直接显示。

1、通过DNS域名解析得到对应的IP地址(例如输入www.baidu.com:客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48)(先从浏览器缓存查询、然后是操作系统和hosts文件的缓存,如果没有则查询本地服务器的缓存)

2、通过TCP的三次握手机制建立连接,建立连接后浏览器向服务器发送HTTP请求,请求数据包。

3、服务器收到浏览器的请求后,进行处理并响应,发回网页内容。

4、浏览器收到服务器数据后,解析html代码

5、浏览器渲染页面并呈现给用户

6、服务器关闭TCP连接

各种协议与HTTP协议之间的关系

8.HTTP协议包括哪些请求?

  • GET:对服务器资源的简单请求
  • POST:用于发送包含用户提交数据(表单呀什么的)的请求
  • HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头
  • PUT:传说中请求文档的一个版本
  • DELETE:发出一个删除指定文档的请求
  • TRACE:发送一个请求副本,以跟踪其处理进程
  • OPTIONS:返回所有可用的方法,检查服务器

9.HTTP中GET和POST的区别:

  1. get请求在URL中传送的参数是有长度限制的(为什么?),而post没有
  2. get没有post安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
  3. get参数通过URL传递,POST放在Reqest body中
  4. get请求参数会被完整保留在浏览器历史记录里,而post参数不会被保留
  5. get请求只能进行URL编码,而post支持对中编码方式
  6. get请求会被浏览器主动cache,而post不会,除非主动设置
  7. get产生的URL地址可以被bookmark(书签),而post不可以
  8. get在浏览器回退时是无害的,而post会再次提交请求

get方法参数有大小限制吗?

一般HTTP协议里并不限制参数大小限制。但一般由于get请求是直接附加在地址栏里面的,由于浏览器地址栏有长度限制,因此使get请求在浏览器实现层面上看会有长度限制。

10.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协议的长连接和短连接。

11.HTTP1.0 与1.1与 2.0与3.0之间的区别

HTTP1.0:默认使用Connection:cloose,(短连接)浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)

HTTP1.1:默认使用Connection:keep-alive(长连接),避免了连接建立和释放的开销;通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。

HTTP2.0:引入二进制数据帧和流的概念,其中帧对数据进行顺序标识;因为有了序列,服务器可以并行的传输数据。

HTTP1.0和HTTP1.1的主要区别:

  • 1.缓存处理:HTTP1.1添加更多的缓存控制策略(如:Entity tag,if-match)
  • 2.网络连接的优化:HTTP1.1支持断点续传
  • 3.错误状态码的增多:HTTP1.1新增了24个错误状态响应码,丰富的错误码更加明确各个状态
  • 4.Host头处理:支持Host头域,不在以IP为请求方标志
  • 5.长连接:减少了建立和关闭连接的消耗和延迟

HTTP1.1和HTTP2.0的主要区别:

  • 1.新的传输格式:2.0使用二进制格式,1.1依然使用基于文本格式
  • 2.多路复用:连接共享,不同的request可以使用同一个连接传输(最后根据每个request上的id号组合成 正常的请求)
  • 3.header压缩:由于1.X中header带有大量的信息,并且得重复传输,2.0使用encoder来减少需要传输的header大小。
  • 4.服务端推送:同Google的SPDUY(1.0的一种升级)一样

HTTP3.0:

  • 基于Google的QUIC协议(使用UDP实现的)
  • 减少了tcp三次握手时间,以及tls握手时间
  • 解决了http2.0中前一个stream丢包导致后一个stream被阻塞的问题
  • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
  • 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
  • 更适合的流量控制

12.HTTPS和HTTP的区别主要如下:

  • 1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  • 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  • 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • 4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

13.HTTP 状态码,301 和 302 有什么具体区别,200 和 304 的区别

状态码可以按照第一个数字分类

1 表示信息,2 表示成功,3 表示重定向,4 表示客户端错误,5 表示服务器错误

常见的状态码有:

101 切换协议,200 成功,301 永久重定向,302 临时重定向,304 未修改

301 和 302 的区别:

301:永久移动,请求的网页已永久移动到新的位置,服务器返回此响应,会自动将请求者转到新位置;
302:历史移动,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来继续以后的请求;

200 和 304的区别:

200 表示成功,服务器已成功处理了请求,通常表示为服务器提供了请求的网页;
304 表示未修改,自从上次请求后,请求的网页未修改过,服务器返回此响应时不会返回网页内容;

14.OSI 七层模型与TCP/IP五层(四层)模型

OSI七层(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)

 TCP/IP五层(物理层、数据链路层、网络层、传输层、应用层)

TCP/IP四层(网络接口层、网络层、传输层、应用层)

15.常见应用层协议和运输层、网络层协议、以及硬件如路由器之类在哪一层?

应用层:HTTP、SMTP、DNS、FTP

传输层:TCP、UDP

网络层:ICMP、IP、路由器、防火墙

数据链路层:网卡、网桥、交换机

物理层:中继器、集线器

16.forward和redirect的区别(转发和重定向的区别):

转发forward:

转发地址栏路径不变,转发只能访问当前服务器下的资源,转发是一次请求,可以使用request对象共享数据

重定向redirect:

地址栏发生变化,重定向可以访问其他站点(服务器)的资源,重定向是两次请求,不能使用request对象来共享数据。

17.URI和URL的区别是什么?

URI:统一资源标志符,可以唯一标识一个资源。(身份证)

URL:统一资源定位符,可以提高该资源的路径。(家庭住址)

URL是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。

18.对称加密算法和非对称加密算法的区别:

对称加密算法:双方持有相同的密钥,进行加密速度快,典型对称加密算法:DES,AES

非对称加密算法:密钥成对出现(私钥,公钥),私钥只有自己知道,不在网络中传输,公钥可以公开。相比对称加密速度较慢,典型非对称加密算法:RSA,DSA.

19.session和cookie的区别:

(1)session用在服务器端,cookie用在客户端浏览器上

(2)session的生效依赖与cookie中的session id,如果cookie禁用了,那么session也会失效

(3)cookie不是浏览器生成的,而是服务器端传递给客户端的(在响应报文中),而session是服务器端生成的,用于保存状态的

(4)cookie不是很安全,别人可以分析存放在本地的cookie进行欺骗,考虑到安全应当使用session。

(5)cookie一般用来保存用户信息,session的主要作用就是通过服务端记录用户的状态

(6)cookie支持跨域访问,session不支持

所以,总结一下:

  1. Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
  2. Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

20.什么是HTTP?

HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

21.TCP的粘包和拆包?

程序需要发送的数据大小和TCP报文段能发送MSS(Maximum Segment Size,最大报文长度)是不一样的,大于MSS时,就需要把程序数据拆分为多个TCP报文段,称之为拆包

小于时,则要考虑合并多个程序数据为一个TCP报文段,则是粘包(可以简单的理解成客户端调用了两次send,服务器端一个recv就把信息都读出来了);

其中 MSS=TCP报文段长度-TCP首部长度 。在IP协议层或者链路层,物理层 都存在拆包粘包现象。

解决拆包和粘包的主要方法有:

最本质原因在于接收对等方无法分辨消息与消息之间的边界在哪,通过使用某种方案给出边界:

  1. 在数据尾部增加特殊字符进行分割;
  2. 将数据定为固定大小;
  3. 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小

22.REST API

REST API全称为表述性状态转移,即利用HTTP中get、post、put、delete以及其他的HTTP方法构成REST中数据资源的增删改查操作:

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

rest api 是前后端分离的最佳实践,是开发的一套标准或者说是一套规范,不是框架。

23.HTTPS和HTTP连接建立的过程

HTTPS的连接过程:

1.浏览器将支持的加密算法信息发送给服务器

2.服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器

3.客户端(SSL/TLS)解析证书验证证书合法性,生成对称加密的密钥,称之为客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。

4.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器

5.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后客户端密钥对数据进行对称加密。这样数据就变成了密文。

6.服务器将加密后的密文发送给客户端

7.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。

对称加密(DES)非对称加密(RSA公私钥) 签名算法(MD5,SHA系列)

HTTP的连接过程:

1.TCP建立连接后,客户端会发送报文给服务端

2.服务端接收报文并做出响应

3.客户端收到响应后解析给用户

24.简述DNS协议

DNS协议是基于UDP的应用层协议,他的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。

25.简述DNS解析过程:

  • 1.客户机发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给DNS服务器
  • 2.本地DNS服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地缓存里面查找。
  • 3.本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名DNS服务器。
  • 4.根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址
  • 5.客户机的dns服务器根据返回的信息接着访问下一级的dns服务器
  • 6.这样递归的一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
  • 7.客户机的本地的dns服务器会将查询结果返回给我们的客户机
  • 8.客户机根据得到的ip信息访问目标主机,完成解析过程

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值