计算机网络常见面试题汇总(建议收藏)

Posted 敲代码敲到头发茂密

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络常见面试题汇总(建议收藏)相关的知识,希望对你有一定的参考价值。


文章目录

(1)说说HTTP常用的状态码及其含义?

状态码含义
200获取数据成功
201创建数据成功、更新数据成功
204删除数据成功
301永久性重定向,会缓冲
302临时性重定向,不会缓冲
400客户端请求的语法错误
401没有认证成功
403认证成功,没有获取到权限
404路由错误,请求资源不存在
405客户端请求中的方法被禁止
406请求格式错误
408服务器等待客户端发送的请求时间过长,超时
500服务端错误
501服务器不具备完成请求的功能。例如,当服务器无法识别请求方法时,服务器可能会返回此代码
502错误网关
503由于超载或系统维护,服务器暂时的无法处理客户端的请求。通常,这只是一种暂时的状态
504服务器作为网关或代理,未及时从上游服务器接收请求
505服务器不支持请求中所使用的 HTTP 协议版本

(2)HTTP 常用的请求方式,区别和用途?

请求方式用途
GET向服务器端获取资源,包括获取列表数据和详情数据
POST向服务端发送创建资源的请求
PUT向服务端发送更新资源的请求
DELETE向服务端发送删除资源的请求
HEAD请求页面的首部,获取资源的元信息
OPTIONS返回所有的可用方法,常用于跨域

(3)请简单说一下你了解的端口及对应的服务?

端口服务
21FTP(文件传输协议)
22ssh
23远程登录服务
25SMTP(邮件传输协议)
53DNS域名服务器
80HTTP超文本传输协议
110POP3邮件协议3
443HTTPS
1080sockets
1521Oracle数据库默认端口
3306mysql服务默认端口

(4)说下计算机网络体系结构?

ISO七层模型:制定的一个用于计算机或通信系统间互联的标准体系。

应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.
表示层:数据的表示、安全、压缩。确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话.
传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.
数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。
物理层:建立、维护、断开物理连接。

TCP/IP 四层模型

应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
传输层: 对应OSI的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。
网络层:对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。
物理链路层:与OSI参考模型的数据链路层、物理层对应。

五层体系结构

应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
传输层:对应OSI参考模型的的传输层
网络层:对应OSI参考模型的的网络层
数据链路层:对应OSI参考模型的的数据链路层
物理层:对应OSI参考模型的的物理层。

(5)如何理解HTTP协议的 “无连接,无状态” 特点?

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。

(6)从浏览器地址栏输入url到显示主页的过程

DNS解析,查找域名对应的IP地址。
与服务器通过三次握手,建立TCP连接
向服务器发送HTTP请求
服务器处理请求,返回网页内容
浏览器解析并渲染页面
TCP四次挥手,连接结束

(7)如果知道目标服务器的服务端口有没有开启?

使用telnet命令可以检查服务器上的端口有没有开启监听,比如telnet 192.168.100.196 7800,如果7800端口没有开启监听,则会提示连接失败。

(8)POST和GET有哪些区别?

POSTGET
向服务端发送请求,用于创建数据向服务端发送请求,用于获取数据
安全(请求数据在请求体中)不安全(请求数据在URL中拼接)
传输数据无大小限制传输数据有大小限制
服务端获取请求数据用request.data服务端获取请求数据用request.GET.get()或者request.query_params.get()
对应后端的action方法为create对应后端的action方法为list或者retrieve
从请求到获取响应比get慢从请求到获取响应比post快

(9)在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

在 HTTP 中响应体的 Connection 字段指定为 keep-alive

(10)HTTP 如何实现长连接?在什么时候会超时?

通过在头部(请求和响应头)设置 Connection: keep-alive,HTTP1.0协议支持,但是默认关闭,从HTTP1.1协议以后,连接默认都是长连接

1、HTTP 一般会有 httpd 守护进程,里面可以设置 keep-alive timeout,当 tcp 链接闲置超过这个时间就会关闭,也可以在 HTTP 的 header 里面设置超时时间

2、TCP 的 keep-alive 包含三个参数,支持在系统内核的 net.ipv4 里面设置:当 TCP 链接之后,闲置了 tcp_keepalive_time,则会发生侦测包,如果没有收到对方的 ACK,那么会每隔 tcp_keepalive_intvl 再发一次,直到发送了 tcp_keepalive_probes,就会丢弃该链接。

(1)tcp_keepalive_intvl = 15
(2)tcp_keepalive_probes = 5
(3)tcp_keepalive_time = 1800

实际上 HTTP 没有长短链接,只有 TCP 有,TCP 长连接可以复用一个 TCP 链接来发起多次 HTTP 请求,这样可以减少资源消耗,比如一次请求 html,可能还需要请求后续的 JS/CSS/图片等

(11)HTTP 与 HTTPS 的区别

HTTPHTTPS
超文本传输协议,是一个基于TCP/IP通信协议来传递明文数据的协议HTTPS 则是具有安全性的 SSL 加密传输协议。
端口80端口443
HTTP 的连接很简单,是无状态的。不安全HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
资源消耗较少资源消耗较多

(12)Https流程是怎样的?

1、客户端向服务端发起建立HTTPS请求。
2、服务器向客户端发送数字证书。
3、客户端验证数字证书,证书验证通过后客户端生成会话密钥(双向验证则此处客户端也会向服务器发送证书)。
4、服务器生成会话密钥(双向验证此处服务端也会对客户端的证书验证)。
5、客户端与服务端开始进行加密会话。

(13)说说HTTP的状态码,301和302的区别?

程序方向来讲这两个状态码,实际上没有多大的区别,都是跳转的返回状态。
但从作用上来讲,301为永久重定向,302为临时重定向

(14)对称加密与非对称加密有什么区别?

对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。

对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.

(15)怎么解决SQL注入?

SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。

举个常见的业务场景:在web表单搜索框输入员工名字,然后后台查询出对应名字的员工。
这种场景下,一般都是前端页面,把一个名字参数username传到后台,然后后台通过SQL把结果查询出来

# 1、导入mysql
from pymysql import *

# 2、创建数据库lianjie
conn = connect(host='localhost',
               port=3306,
               user='root',
               db='ceshi_platform',
               charset='utf8')
print(conn)
# 3、打开游标
cur=conn.cursor()
# 4、执行sql语句
# 让用户输入用户名和密码
username=input('请输入用户名:')

# 编写sql语句
sql="select * from auth_user where username='%s'"%(username)
print(sql)
# 执行sql语句,返回查询到的记录条数rowcount,如果是rowcount不为0,则登录成功,否则登录失败
rowcount = cur.execute(sql)
if rowcount!=0:
    print('登录成功')
else:
    print('登录失败')

# 5、关闭游标
cur.close()
# 6、关闭连接
conn.close()

执行结果:

请输入用户名:' or '1=1
select * from auth_user where username='' or '1=1'
登录成功

如何预防SQL注入问题

对sql语句进行参数化

# 1、导入mysql
from pymysql import *

# 2、创建数据库lianjie
conn = connect(host='localhost',
               port=3306,
               user='root',
               db='ceshi_platform',
               charset='utf8')
print(conn)
# 3、打开游标
cur=conn.cursor()
# 4、执行sql语句
# 让用户输入用户名和密码
username=input('请输入用户名:')

# 编写sql语句
sql="select * from auth_user where username=%s"
params=(username,)
print(sql)
# 执行sql语句,返回查询到的记录条数rowcount,如果是rowcount不为0,则登录成功,否则登录失败
rowcount = cur.execute(sql,params)
if rowcount!=0:
    print('登录成功')
else:
    print('登录失败')

#

#
# 5、关闭游标
cur.close()
# 6、关闭连接
conn.close()

执行结果:

请输入用户名:' or '1=1
select * from auth_user where username=%s
登录失败

(16)说说DNS的解析过程?

(1)操作系统先查本地 hosts文件 中是否有记录,如果有,则直接返回相对应映射的IP地址。
(2)如果本地hosts文件中没有配置,则主机向自己的本地DNS服务器发送查询报文,如果本地DNS服务器缓存中有,将直接返回结果。
(3)如果本地服务器缓存中没有,则从内置在内部的根DNS服务器列表(全球13台,固定的IP地址)中选一个发送查询报文。
(4)根服务器解析域名中的后缀名,告诉本地服务器负责该后缀名的所有顶级服务器列表。
(5)本地服务器选择其中一个顶级域服务器发送查询请求,顶级域服务器拿到域名后继续解析,返回对应域的所有权威服务器列表。
(6)本地服务器再向返回的权威服务器发送查询报文,最终会从某一个权威服务器上得到具体的 IP 地址。
(7)主机返回结果IP。

(17)什么是CSRF攻击,如何避免

CSRF,跨站请求伪造(英文全称是Cross-site request
forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:
1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值
2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性
3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御

(18)聊聊五层计算机网络体系结构中,每一层对应的网络协议有哪些?

HTTPHTTPS
应用层HTTP(超文本传输协议) FTP(文本传输协议) SMTP(简单的邮件传输协议) DNS(域名系统) SSH(安全外壳协议) DHCP(动态主机配置协议) TELNET(远程登陆协议)
传输层TCP UDP
网络层IP(网际协议) ARP RARP ICMP IGMP OSPF BGF
数据链路层ARQ PPP
物理层网线

(19)说说 WebSocket与socket的区别

Socket是传输控制层协议
websocket是应用层协议

(20)为什么说UDP是不可靠的?UDP的优势在哪里?

UDP是无连接的,在收发数据之前不需要建立连接,直接将数据丢到目标IP和端口上就可以了,不确定对端是否收到了数据,没有TCP中的ACK确认机制,也没有TCP中的丢包重传机制。所以,UDP是不可靠的。但UDP因为没有TCP的ACK确认机制,数据发送的实时性比较好。

(21)说说TCP的重传机制

对于TCP连接,数据发送方将数据发出去后,会启动一个定时器,等待接收端回ACK确认包,如果在指定的时间内没有收到ACK确认包,就会触发TCP的丢包重传机制。如果发送重传包后还是没收到ACK,下一次的重传时间间隔会加倍,当重传次数达到系统上限(Windows默认的上限是5次,Linux默认的上限是15次)后,协议栈就认为网络出故障了,协议栈会直接将对应的连接关闭了。
所以当网络出现故障时有数据交互,协议栈会在数十秒内检测到网路出现异常,就会直接将连接直接关闭掉

(22)Http请求的过程与原理

客户端进行DNS域名解析,得到对应的IP地址
根据这个IP,找到对应的服务器建立连接(三次握手)
建立TCP连接后发起HTTP请求(一个完整的http请求报文)
服务器响应HTTP请求,客户端得到html代码
客户端解析html代码,用html代码中的资源(如js,css,图片等等)渲染页面。
服务器关闭TCP连接(四次挥手)

(23)forward和redirect的区别?

直接转发方式(Forward) :客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
间接转发方式(Redirect) :实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

(24)说说TCP是如何确保可靠性的呢?

首先,TCP的连接是基于三次握手,而断开则是基于四次挥手。确保连接和断开的可靠性。
其次,TCP的可靠性,还体现在有状态;TCP会记录哪些数据发送了,哪些数据被接收了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。
再次,TCP的可靠性,还体现在可控制。它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制。

(25)Session和Cookie的区别?

Cookie是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务器就是根据这个Cookie来确认身份的。

session指的就是服务器和客户端一次会话的过程。Session利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。Session对象存储着特定用户会话所需的属性及配置信息。

用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的Session,请求返回时将此Session的唯一标识信息SessionID返回给浏览器,浏览器接收到服务器返回的SessionID信息后,会将此信息存入Cookie中,同时Cookie记录此SessionID是属于哪个域名。

当用户第二次访问服务器时,请求会自动判断此域名下是否存在Cookie信息,如果存在,则自动将Cookie信息也发送给服务端,服务端会从Cookie中获取SessionID,再根据 SessionID查找对应的 Session信息,如果没有找到,说明用户没有登录或者登录失效,如果找到Session证明用户已经登录可执行后面操作。

(26)IP地址有哪些分类?

一般可以这么认为,IP地址=网络号+主机号。

网络号:它标志主机所连接的网络地址表示属于互联网的哪一个网络。
主机号:它标志主机地址表示其属于该网络中的哪一台主机。
IP地址分为A,B,C,D,E五大类:

A类地址(1~126):以0开头,网络号占前8位,主机号占后面24位。
B类地址(128~191):以10开头,网络号占前16位,主机号占后面16位。
C类地址(192~223):以110开头,网络号占前24位,主机号占后面8位。
D类地址(224~239):以1110开头,保留位多播地址。
E类地址(240~255):以11110开头,保留位为将来使用

(27)为什么说TCP是可靠的?

TCP是基于连接的,在进行数据通信之前需要先通过三次握手建立TCP连接,TCP连接建立后才能收发数据。在收发数据时有个ACK确认机制,数据发送方在将数据发出后,需要等待对方的ACK包回应,收到ACK包才表示对方收到数据了,才会接着发下一包。

如果在指定的时间内没有收到对方的回应,则会触发丢包重传。正是三次握手、ACK确认、丢包重传等机制的存在,保证了TCP的可靠性。

(28)有了IP地址,为什么还要用MAC地址?

简而言之,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来就相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。
那只使用MAC地址不用IP地址行不行呢?不行的!因为最早就是MAC地址先出现的,并且当时并不用IP地址,只用MAC地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可。
那为什么要用IP地址呢?是因为IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。
IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。

(29)TCP 和 UDP 分别对应的常见应用层协议有哪些?

基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH

HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
TELNET: Teletype over the Network (网络电传), 默认端口23
SSH:Secure Shell(安全外壳协议),默认端口 22

基于UDP的应用层协议:DNS、TFTP、SNMP

DNS : Domain Name Service (域名服务),默认端口 53
TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有-Trap信息采用UDP端口162。

(30)如果服务器出现了大量CLOSE_WAIT状态如何解决

服务器端收到客户端发送的FIN后,TCP协议栈就会自动发送ACK,接着进入CLOSE_WAIT状态。
但是如果服务器端不执行socket的close()操作,那么就没法进入LAST_ACK,导致大量连接处于CLOSE_WAIT状态
所以,如果服务器出现了大量CLOSE_WAIT状态,一般是程序Bug,或者关闭socket不及时。

(31)URI和URL的区别

URI,全称是Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。
URL,全称是Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源的路径。打个经典比喻吧,URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。

(32)ICMP协议的功能

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
比如我们日常使用得比较多的ping,就是基于ICMP的。

(33)TCP和UDP区别

TCPUDP
面向字节流面向报文
面向连接面向无连接
只能一对一支持一对多 多对多 多对一交互通信
首部最小20字节,最大60字节首部开销小,仅8字节
数据传输可靠,具有丢包重传,流量控制和拥塞阻塞数据传输不可靠,会出现丢包,不使用流量控制和拥塞控制
使用于要求可靠传输的应用适用于实时应用(IP电话,直播,视频会议)

(34)请详细介绍一下TCP 的三次握手机制

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

第一次握手:保证了服务端可以接收到信息、客户端可以发送消息
第二次握手:保证了客户端知道服务端可以发送、接受消息,服务端知道客户端可以发送信息
第三次握手:保证了服务端知道客户端可以接收消息

(35)TCP握手为什么是三次,为什么不能是两次?不能是四次?

前两次握手客户端可以确认服务端的接收和发送是正常的(一个来回),但是服务端却不知道客户端的发送能力是否正常,那 TCP 的可靠性就无从谈起,所以需要第三次握手来确认双方的收发能力,以确保TCP连接的可靠性。

(36)说说TCP四次挥手过程

第一次挥手:客户端发送FIN标识到服务端,告知服务端我要释放连接
第二次挥手:服务端收到FIN标识,知道了客户端想断开连接,于是马上检查是否还有数据发送给客户端,如果还有数据没有发送,就发送ACK标识告诉客户端:等一会,你还有数据在我这里
第三次挥手:待所有数据发送完毕后,服务端发送FIN标识给客户端,告诉客户端,现在已经没有数据了,我要关闭连接啦
第四次挥手:客户端收到服务端的FIN标识,知道服务端现在就要关闭连接了,于是就发送ACK标识,告知服务端:我知道啦,你关吧
于是服务器关闭,客户端也关闭了

(37)TCP挥手为什么需要四次呢?

首先第四次挥手和第三次握手有异曲同工之妙,最终握手和挥手的目的都是让服务端知道,你发过来的报文我已经收到了。你的(服务端)发送功能没有出现故障。
如果没有第四次挥手,我们假设当服务端第二次发送报文之后,可以直接断开连接。若直接断开连接,由于某些原因,客户端可能并没有收到服务端发来的第二次报文,但是服务端自己认为客户端已经收到了,那么就有可能导致服务端在第一次和第二次发送报文的过程中,遗留的待传数据不完整。
因此第四次挥手是确保服务端---->客户端之间的传输是没有问题的。是一个必要的过程

(38)TCP四次挥手过程中,为什么需要等待2MSL,才进入CLOSED关闭状态

四次挥手中的2MSL的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。
比如如果服务端没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,客户端接收到 FIN 后,会重发 ACK 给服务端, 一来一去正好 2 个 MSL。

(39)TCP的粘包和拆包

所谓粘包拆包问题主要还是因为:

1、接收方不知道消息之间的界限,不知道一个消息要提取多少字节的数据所造成的。 (服务器端出现黏包)
2、tcp在发送数据少且间隔时间短的数据时,会将几条和并一起发送。(客户端出现黏包)

目前比较合理的处理方法是:为字节流加上一个报头,告诉发送的字节流总大小,然后接收端来一个死循环接收完所有数据。用struck将序列化后的数据长度打包成4个字节(4个字节完全够用)。
使用struct模块可以用于将Python的值根据格式符,转换为C语言的结构(byte类型),便于数据流传输。

(40)聊聊TCP的流量控制

TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流量控制。

但是发送端不能疯狂地向接收端发送数据,因为接收端接收不过来的话,接收方只能把处理不过来的数据存在缓存区里。如果缓存区都满了,发送方还在疯狂发送数据的话,接收方只能把收到的数据包丢掉,这就浪费了网络资源。

TCP通过滑动窗口来控制流量,我们看下流量控制的简要流程吧:
首先双方三次握手,初始化各自的窗口大小,均为 400 个字节。

1.假如当前发送方给接收方发送了200个字节,那么,发送方的SND.NXT会右移200个字节,也就是说当前的可用窗口减少了200 个字节。
2.接受方收到后,放到缓冲队列里面,REV.WND =400-200=200字节,所以win=200字节返回给发送方。接收方会在 ACK 的报文首部带上缩小后的滑动窗口200字节
3.发送方又发送200字节过来,200字节到达,继续放到缓冲队列。不过这时候,由于大量负载的原因,接受方处理不了这么多字节,只能处理100字节,剩余的100字节继续放到缓冲队列。这时候,REV.WND = 400-200-100=100字节,即win=100返回发送方。
4.发送方继续干活,发送100字节过来,这时候,接受窗口win变为0。
5.发送方停止发送,开启一个定时任务,每隔一段时间,就去询问接受方,直到win大于0,才继续开始发送。


计算机网络常见面试题汇总(建议收藏!!!)

目录

(1)说说HTTP常用的状态码及其含义?

思路: 这道面试题主要考察候选人,是否掌握HTTP状态码这个基础知识点。

不管是不是面试需要,我们都要知道,日常开发中的这几个状态码的含义:

(2)HTTP 常用的请求方式,区别和用途?

思路: 这道题主要考察候选人,是否掌握HTTP请求方式这个基础知识点,我们用得比较多就是GET和POST

  • GET:对服务器资源获取的简单请求
  • POST:用于发送包含用户提交数据的请求

(3)请简单说一下你了解的端口及对应的服务?

(4)说下计算机网络体系结构?

思路: 这道题主要考察候选人,计算机网络体系结构这个基础知识点。
计算机网路体系结构,有三层:

  • ISO七层模型
  • TCP/IP四层模型
  • 五层协议体系结构

ISO七层模型

ISO七层模型是国际标准化组织(International Organization for
Standardization)制定的一个用于计算机或通信系统间互联的标准体系。

  • 应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.
  • 表示层:数据的表示、安全、压缩。确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
  • 会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话.
  • 传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.
  • 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.
  • 数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。
  • 物理层:建立、维护、断开物理连接。

TCP/IP 四层模型

  • 应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
  • 传输层: 对应OSI的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。
  • 网际层:对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。
  • 网络接口层:与OSI参考模型的数据链路层、物理层对应。

五层体系结构

  • 应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
  • 传输层:对应OSI参考模型的的传输层
  • 网络层:对应OSI参考模型的的网络层
  • 数据链路层:对应OSI参考模型的的数据链路层
  • 物理层:对应OSI参考模型的的物理层。

(5)如何理解HTTP协议是无状态的

思路: 这道题主要考察候选人,是否理解Http协议,它为什么是无状态的呢?如何使它有状态呢?

如何理解无状态这个词呢?

当浏览器第一次发送请求给服务器时,服务器响应了;如果同个浏览器发起第二次请求给服务器时,它还是会响应,但是呢,服务器不知道你就是刚才的那个浏览器。简言之,服务器不会去记住你是谁,所以是无状态协议。

可以通过一个生活中的例子,来更好理解并记住它:

有状态场景:

  • 小红:今天吃啥子?
  • 小明:罗非鱼~
  • 小红:味道怎么样呀?
  • 小明:还不错,好香

无状态的场景:

  • 小红:今天吃啥子?
  • 小明:罗非鱼~
  • 小红:味道怎么样呀?
  • 小明:?啊?你说啥?什么鬼?什么味道怎么样?

Http加了Cookie的话:

  • 小红:今天吃啥子?
  • 小明:罗非鱼~
  • 小红:你今天吃的罗非鱼,味道怎么样呀?
  • 小明:还不错,好香。

(6)从浏览器地址栏输入url到显示主页的过程

思路: 这道题主要考察的知识点是HTTP的请求过程,DNS解析,TCP三次握手,四次挥手这几个要点,我们都可以讲下。

  1. DNS解析,查找域名对应的IP地址。
  2. 与服务器通过三次握手,建立TCP连接
  3. 向服务器发送HTTP请求
  4. 服务器处理请求,返回网页内容
  5. 浏览器解析并渲染页面
  6. TCP四次挥手,连接结束

(7)说下HTTP/1.0、1.1、2.0的区别

思路: 这道题主要考察的知识点是HTTP几个版本的区别,我们记住HTTP/1.0默认是短连接,可以强制开启,HTTP/1.1默认长连接HTTP/2.0采用多路复用就差不多。

HTTP/1.0

  • 默认使用 短连接,每次请求都需要建立一个TCP连接。它可以设置Connection: keep-alive 这个字段,强制开启长连接。

HTTP/1.1

  • 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用。
  • 分块传输编码,即服务端没产生一块数据,就发送一块,用”流模式”取代”缓存模式”。
  • 管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求。

HTTP/2.0

  • 二进制协议,1.1版本的头信息是文本(ASCII编码),数据体可以是文本或者二进制;2.0中,头信息和数据体都是二进制。
  • 完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
  • 报头压缩,HTTP协议不带有状态,每次请求都必须附上所有信息。Http/2.0引入了头信息压缩机制,使用gzip或compress压缩后再发送。
  • 服务端推送,允许服务器未经请求,主动向客户端发送资源。

(8)POST和GET有哪些区别?

思路: 这道题主要考察的知识点是POST和GET的区别,可以从数据包、编码方式、请求参数、收藏为书签、历史记录、安全性等几方面去回答。

(9)在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

这个问题记住keep-alive就好,也就是说,在HTTP中响应体的Connection字段指定为keep-alive即可

(10)HTTP 如何实现长连接?在什么时候会超时?

思路: 这道题实际上是考察TCP长连接的知识点HTTP的长连接实质是指TCP的长连接
至于什么时候超时,我们记住这几个参数如tcp_keepalive_time、tcp_keepalive_probes就好

什么是HTTP的长连接?

  • HTTP分为长连接和短连接,本质上说的是TCP的长短连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才具有真正的长连接和短连接这一说法。

  • TCP长连接可以复用一个TCP连接,来发起多次的HTTP请求,这样就可以减少资源消耗,比如一次请求HTML,如果是短连接的话,可能还需要请求后续的JS/CSS。

如何设置长连接?
通过在头部(请求和响应头)设置Connection字段指定为keep-alive,HTTP/1.0协议支持,但是是默认关闭的,从HTTP/1.1以后,连接默认都是长连接。

在什么时候会超时?

  • HTTP一般会有httpd守护进程,里面可以设置keep-alive timeout,当tcp连接闲置超过这个时间就会关闭,也可以在HTTP的header里面设置超时时间
  • TCP 的keep-alive包含三个参数,支持在系统内核的net.ipv4里面设置;当 TCP 连接之后,闲置了tcp_keepalive_time,则会发生侦测包,如果没有收到对方的ACK,那么会每隔 tcp_keepalive_intvl再发一次,直到发送了tcp_keepalive_probes,就会丢弃该连接。
1. tcp_keepalive_intvl = 15
2. tcp_keepalive_probes = 5
3. tcp_keepalive_time = 1800

(11)HTTP 与 HTTPS 的区别

思路: 这道题实际上考察的知识点是HTTP与HTTPS的区别,这个知识点非常重要,可以从安全性、数据是否加密、默认端口等这几个方面去回答。其实,当你理解HTTPS的整个流程,就可以很好回答这个问题

HTTP,即超文本传输协议,是一个基于TCP/IP通信协议来传递明文数据的协议。HTTP会存在这几个问题:

  • 请求信息是明文传输,容易被窃听截取。
  • 没有验证对方身份,存在被冒充的风险
  • 数据的完整性未校验,容易被中间人篡改

为了解决Http存在的问题,Https出现

Https是什么?

HTTPS= HTTP+SSL/TLS ,可以理解Https是身披SSL(Secure Socket Layer,安全套接层)的HTTP。

它们主要区别如下:

(12)Https流程是怎样的?

思路: 这道题实际上考察的知识点是HTTPS的工作流程,大家需要回答这几个要点,公私钥、数字证书、加密、对称加密、非对称加密。

  • HTTPS = HTTP + SSL/TLS,也就是用SSL/TLS对数据进行加密和解密,Http进行传输。
  • SSL,即Secure Sockets Layer(安全套接层协议),是网络通信提供安全及数据完整性的一种安全协议。
  • TLS,即Transport Layer Security(安全传输层协议),它是SSL3.0的后续版本。

  1. 客户端发起Https请求,连接到服务器的443端口。
  2. 服务器必须要有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
  3. 服务器将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
  4. 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
  5. 客户端将公钥加密后的密钥发送到服务器。
  6. 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文。
  7. 服务器将加密后的密文返回到客户端。
  8. 客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。

(13)说说HTTP的状态码,301和302的区别?

思路: 这道题考查的知识点,也是HTTP状态码,302和301都有重定向的含义,但是它们也是有区别的。

  • 301:(永久性转移)请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。
  • 302:(暂时性转移)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应GET和HEAD请求的301代码类似,会自动将请求者转到不同的位置。

网上有个很形象的例子比喻:

当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转,打个比方说,我有一套房子,但是最近走亲戚去亲戚家住了,过两天我还回来的。而使用301跳转的场景就是之前的网站因为某种原因需要移除掉,然后要到新的地址访问,是永久性的,就比如你的那套房子其实是租的,现在租期到了,你又在另一个地方找到了房子,之前租的房子不住了。

(14)说说什么是数字签名?什么是数字证书?

思路: 这道题考查的知识点,不仅仅是数字签名,数字证书,很可能面试官也会问你https的原理的,因为https原理跟数字证书有关的,大家需要掌握https原理。

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改:

数字证书构成

  • 公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名
  • 公钥和个人信息、数字签名共同构成数字证书

(15)对称加密与非对称加密有什么区别?

思路: 这道题考察的知识点是对称加密与非对称加密算法,什么是对称加密,什么是非对称加密呢?

对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如何安全将密钥传输给另一方。常见的对称加密算法有:DES、AES等。

非对称加密:指的是加密和解密使用不同的密钥(即公钥和私钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。常见的非对称加密算法有RSA。

(16)说说DNS的解析过程?

思路: 这道题考察的知识点是DNS域名解析,http请求的过程,是涉及到DNS域名解析的,这道面试题也挺经典的。

DNS,英文全称是domain name system,域名解析系统,是Internet上作为域名和IP相互映射的一个分布式数据库。它的作用很明确,就是可以根据域名查出对应的IP地址。在浏览器缓存、本地DNS服务器、根域名服务器都是怎么查找的。

DNS的解析过程如下图:

假设你要查询www.baidu.com的IP地址:

  • 首先会查找浏览器的缓存,看看是否能找到www.baidu.com对应的IP地址,找到就直接返回;否则进行下一步。
  • 将请求发往给本地DNS服务器,如果查找到也直接返回,否则继续进行下一步;
  • 本地DNS服务器向根域名服务器发送请求,根域名服务器返回负责.com的顶级域名服务器的IP地址的列表。
  • 本地DNS服务器再向其中一个负责.com的顶级域名服务器发送一个请求,返回负责.baidu的权威域名服务器的IP地址列表。
  • 本地DNS服务器再向其中一个权威域名服务器发送一个请求,返回www.baidu.com所对应的IP地址。

(17)什么是CSRF攻击,如何避免

思路: 这道题考察的知识点是CSRF攻击,它是属于网络安全这块的知识点,还有Xss攻击、SQL注入、DDoS等这些常见的网络攻击,我们都需要知道攻击的流程。

什么是CSRF 攻击?

CSRF,跨站请求伪造(英文全称是Cross-site request
forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

CSRF是如何攻击的呢?
来看一个来自百度百科的例子:

  1. Tom 登陆银行,没有退出,浏览器包含了Tom在银行的身份认证信息。

  2. 黑客Jerry将伪造的转账请求,包含在在帖子

  3. Tom在银行网站保持登陆的情况下,浏览帖子

  4. 将伪造的转账请求连同身份认证信息,发送到银行网站

  5. 银行网站看到身份认证信息,以为就是Tom的合法操作,最后造成Tom资金损失。

怎么解决CSRF攻击呢?

  • 检查Referer字段。
  • 添加校验token。

(18)聊聊五层计算机网络体系结构中,每一层对应的网络协议有哪些?

为了大家方便记忆,我还是画个思维导图吧,如下:

(19)说说 WebSocket与socket的区别

  • Socket其实就是等于IP地址 + 端口 + 协议
  • WebSocket是一个持久化的协议,它是伴随H5而出的协议,用来解决http不支持持久化连接的问题。
  • Socket一个是网编编程的标准接口,而WebSocket则是应用层通信协议。

具体来说,Socket是一套标准,它完成了对TCP/IP的高度封装,屏蔽网络细节,以方便开发者更好地进行网络编程。

(20)什么是DoS、DDoS、DRDoS攻击?

  • DOS: (Denial of Service),翻译过来就是拒绝服务,一切能引起DOS行为的攻击都被称为DOS攻击。最常见的DoS攻击就有计算机网络宽带攻击、连通性攻击。
  • DDoS: (Distributed Denial of Service),翻译过来是分布式拒绝服务。是指处于不同位置的多个攻击者同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。常见的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood等
  • DRDoS: (Distributed Reflection Denial of Service),中文是分布式反射拒绝服务,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,从而形成拒绝服务攻击。

(21)什么是XSS攻击,如何避免?

思路: XSS攻击也是比较常见,XSS,叫跨站脚本攻击(Cross-Site Scripting),因为会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS

XSS是如何攻击的呢?

拿反射型举个例子吧,流程图如下:

如何解决XSS攻击问题?

  • 对输入进行过滤,过滤标签等,只允许合法值。
  • HTML转义
  • 对于链接跳转,如<a href=“xxx” 等,要校验内容,禁止以script开头的非法链接。
  • 限制输入长度

(22)Http请求的过程与原理

思路: HTTP请求,一个非常非常基础的知识点,一定需要掌握的。其实觉得跟浏览器地址栏输入url到显示主页这道题有点类似。

HTTP是一个基于TCP/IP协议来传递数据的超文本传输协议,传输的数据类型有HTML,图片等。以访问百度有例子,看下一次Http的请求过程吧

  1. 客户端进行DNS域名解析,得到对应的IP地址
  2. 根据这个IP,找到对应的服务器建立连接(三次握手)
  3. 建立TCP连接后发起HTTP请求(一个完整的http请求报文)
  4. 服务器响应HTTP请求,客户端得到html代码
  5. 客户端解析html代码,用html代码中的资源(如js,css,图片等等)渲染页面。
  6. 服务器关闭TCP连接(四次挥手)

(23)forward和redirect的区别?

  • 直接转发方式(Forward) :客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
  • 间接转发方式(Redirect) :实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

举个通俗的例子:

  • 直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;
  • 间接转发就相当于:“A找B借钱,B说没有,让A去找C借”。

看下这两个图,可以更容易理解一些:
Redirect 的工作原理:

forward 的工作原理:

(24)聊聊SQL注入?

SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。

SQL注入是如何攻击的?
举个常见的业务场景:在web表单搜索框输入员工名字,然后后台查询出对应名字的员工。

这种场景下,一般都是前端页面,把一个名字参数name传到后台,然后后台通过SQL把结果查询出来

name = "田螺"; //前端传过来的

SQL= "select * from staff where name=" + name;  //根据前端传过来的name参数,查询数据库员工表staff

因为SQL是直接拼接的,如果我们完全信任前端传的参数的话。假如前端传这么一个参数时’’ or ‘1’=‘1’,SQL就变成这样:

select * from staff where name='' or '1'='1';

这个SQL会把所有的员工信息全都查出来了,这样请求用户已经越权了。请求者可以获取所有员工的信息,信息已经暴露了。

如何预防SQL注入问题

  1. 使用#而不是 $
  2. 不要暴露一些不必要的日志或者安全信息,比如避免直接响应一些sql异常信息。
  3. 不相信任何外部输入参数,过滤参数中含有的一些数据库关键词关键词
  4. 适当的权限控制

(25)Session和Cookie的区别?

我们先来看Session和Cookie的概念吧:

  • Cookie是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务器就是根据这个Cookie来确认身份的。
  • session指的就是服务器和客户端一次会话的过程。Session利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。Session对象存储着特定用户会话所需的属性及配置信息。

Session 和Cookie的区别主要有这些:

来看个图吧:

  • 用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的Session,请求返回时将此Session的唯一标识信息SessionID返回给浏览器,浏览器接收到服务器返回的SessionID信息后,会将此信息存入Cookie中,同时Cookie记录此SessionID是属于哪个域名。
  • 当用户第二次访问服务器时,请求会自动判断此域名下是否存在Cookie信息,如果存在,则自动将Cookie信息也发送给服务端,服务端会从Cookie中获取SessionID,再根据 SessionID查找对应的 Session信息,如果没有找到,说明用户没有登录或者登录失效,如果找到Session证明用户已经登录可执行后面操作。

(26)IP地址有哪些分类?

一般可以这么认为,IP地址=网络号+主机号。

  • 网络号:它标志主机所连接的网络地址表示属于互联网的哪一个网络。
  • 主机号:它标志主机地址表示其属于该网络中的哪一台主机。

IP地址分为A,B,C,D,E五大类:

  • A类地址(1~126):以0开头,网络号占前8位,主机号占后面24位。
  • B类地址(128~191):以10开头,网络号占前16位,主机号占后面16位。
  • C类地址(192~223):以110开头,网络号占前24位,主机号占后面8位。
  • D类地址(224~239):以1110开头,保留位多播地址。
  • E类地址(240~255):以11110开头,保留位为将来使用

(27)说下ARP 协议的工作过程?

ARP 协议协议,Address Resolution Protocol,地址解析协议,它是用于实现IP地址到MAC地址的映射。

  1. 首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。

  2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己的ARP列表,是否存在该IP地址对应的MAC地址;如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求的数据包里,包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

  3. 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同,就会忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址。

  4. 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

(28)有了IP地址,为什么还要用MAC地址?

  • 简而言之,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来就相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。
  • 那只使用MAC地址不用IP地址行不行呢?不行的!因为最早就是MAC地址先出现的,并且当时并不用IP地址,只用MAC地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可。
  • 那为什么要用IP地址呢?是因为IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。
  • IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。

(29)TCP 和 UDP 分别对应的常见应用层协议有哪些?

基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH

  • HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
  • FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
  • SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
  • TELNET: Teletype over the Network (网络电传), 默认端口23
  • SSH:Secure Shell(安全外壳协议),默认端口 22

基于UDP的应用层协议:DNS、TFTP、SNMP

  • DNS : Domain Name Service (域名服务),默认端口 53
  • TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
  • SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有-Trap信息采用UDP端口162。

(30)聊聊保活计时器的作用

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。设想这样的场景:客户已主动与服务器建立了TCP连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75秒钟发送一次。若连续发送10个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

(31)如果服务器出现了大量CLOSE_WAIT状态如何解决

我们先来复习下TCP的四次挥手

  • 服务器端收到客户端发送的FIN后,TCP协议栈就会自动发送ACK,接着进入CLOSE_WAIT状态。
  • 但是如果服务器端不执行socket的close()操作,那么就没法进入LAST_ACK,导致大量连接处于CLOSE_WAIT状态
  • 所以,如果服务器出现了大量CLOSE_WAIT状态,一般是程序Bug,或者关闭socket不及时。

(32)URI和URL的区别

  • URI,全称是Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。
  • URL,全称是Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源的路径。打个经典比喻吧,URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。

(33)ICMP协议的功能

ICMP,Internet Control Message Protocol ,Internet控制消息协议。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
  • 当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

比如我们日常使用得比较多的ping,就是基于ICMP的。

(34)说下ping的原理

ping,Packet Internet Groper,是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送ICMP(Internet Control Message Protocol 因特网报文控制协议) 请求报文,测试目的站是否可达及了解其有关状态

一般来说,ping可以用来检测网络通不通。它是基于ICMP协议工作的。假设机器A ping机器B,工作过程如下:

  1. ping通知系统,新建一个固定格式的ICMP请求数据包
  2. ICMP协议,将该数据包和目标机器B的IP地址打包,一起转交给IP协议层
  3. IP层协议将本机IP地址为源地址,机器B的IP地址为目标地址,加上一些其他的控制信息,构建一个IP数据包
  4. 先获取目标机器B的MAC地址。
  5. 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址
  6. 机器B收到后,对比目标地址,和自己本机的MAC地址是否一致,符合就处理返回,不符合就丢弃。
  7. 根据目的主机返回的ICMP回送回答报文中的时间戳,从而计算出往返时间
  8. 最终显示结果有这几项:发送到目的主机的IP地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大& 平均值

(35)请详细介绍一下TCP 的三次握手机制

思路: TCP连接的三次握手机制,最重要的知识点,必须得会,通讯过程以及客户端、服务器的对应的状态都需要记住。

TCP提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的就是同步连接双方的序列号和确认号并交换TCP窗口大小信息。我们一起来看下流程图:

  • 第一次握手(SYN=1, seq=x),发送完毕后,客户端就进入SYN_SEND状态
  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端就进入SYN_RCV状态。
  • 第三次握手(ACK=1,ACKnum=y+1),发送完毕后,客户端进入ESTABLISHED状态,当服务器端接收到这个包时,也进入ESTABLISHED状态。

(36)TCP握手为什么是三次,为什么不能是两次?不能是四次?

思路: TCP握手为什么不能是两次,为什么不能是四次呢?为了方便理解,我们以男孩子和女孩子谈恋爱为例子:两个人能走到一起,最重要的事情就是相爱,就是我爱你,并且我知道,你也爱我,接下来我们以此来模拟三次握手的过程:

为什么握手不能是两次呢?

  • 如果只有两次握手,女孩子可能就不知道,她的那句我也爱你,男孩子是否收到,恋爱关系就不能愉快展开。

为什么握手不能是四次呢?

  • 因为握手不能是四次呢?因为三次已经够了,三次已经能让双方都知道:你爱我,我也爱你。而四次就多余了。

(37)说说TCP四次挥手过程

思路: TCP的四次挥手,也是最重要的知识点,一般跟三次握手会一起考的,必须得记住。

  1. 第一次挥手(FIN=1,seq=u),发送完毕后,客户端进入FIN_WAIT_1状态。
  2. 第二次挥手(ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后,进入FIN_WAIT_2状态。
  3. 第三次挥手(FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个ACK。
  4. 第四次挥手(ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。

(38)TCP挥手为什么需要四次呢?

思路: TCP挥手为什么需要四次呢?为了方便大家理解,再举个生活的例子吧。

小明和小红打电话聊天,通话差不多要结束时,小红说,“我没啥要说的了”。小明回答,“我知道了”。但是小明可能还有要说的话,小红不能要求小明跟着她自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说,“我说完了”,小红回答,“我知道了”,这样通话才算结束。

(39)TCP四次挥手过程中,为什么需要等待2MSL,才进入CLOSED关闭状态

思路: 这个问得频率特别高。

2MSL,two Maximum Segment Lifetime,即两个最大段生命周期。假设主动发起挥手的是客户端,那么需要2MSL的原因是:

  1. 为了保证客户端发送的最后一个ACK报文段能够到达服务端。 这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的服务端就收不到对已发送的FIN + ACK报文段的确认。服务端会超时重传这个FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动2MSL计时器。最后,客户端和服务器都正常进入到CLOSED状态。
  2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

(40)TCP的粘包和拆包

TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。


为什么会产生粘包和拆包呢?

  • 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
  • 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
  • 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。

解决方案:

  • 发送端将每个数据包封装为固定长度
  • 在数据尾部增加特殊字符进行分割
  • 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。

(41)TCP和UDP区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

(42)聊聊TCP的流量控制

TCP三次握手,发送端和接收端进入到ESTABLISHED状态,它们即可以传输数据。

但是发送端不能疯狂地向接收端发送数据,因为接收端接收不过来的话,接收方只能把处理不过来的数据存在缓存区里。如果缓存区都满了,发送方还在疯狂发送数据的话,接收方只能把收到的数据包丢掉,这就浪费了网络资源。

TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流量控制

TCP通过滑动窗口来控制流量,我们看下流量控制的简要流程吧:

首先双方三次握手,初始化各自的窗口大小,均为 400 个字节。

  1. 假如当前发送方给接收方发送了200个字节,那么,发送方的SND.NXT会右移200个字节,也就是说当前的可用窗口减少了200 个字节。
  2. 接受方收到后,放到缓冲队列里面,REV.WND =400-200=200字节,所以win=200字节返回给发送方。接收方会在 ACK 的报文首部带上缩小后的滑动窗口200字节
  3. 发送方又发送200字节过来,200字节到达,继续放到缓冲队列。不过这时候,由于大量负载的原因,接受方处理不了这么多字节,只能处理100字节,剩余的100字节继续放到缓冲队列。这时候,REV.WND = 400-200-100=100字节,即win=100返回发送方。
  4. 发送方继续干活,发送100字节过来,这时候,接受窗口win变为0。
  5. 发送方停止发送,开启一个定时任务,每隔一段时间,就去询问接受方,直到win大于0,才继续开始发送。

(43)说说半连接队列和 SYN Flood攻击的关系

TCP进入三次握手前,服务端会从CLOSED状态变为LISTEN状态,同时在内部创建了两个队列:半连接队列(SYN队列)和全连接队列(ACCEPT队列)。

什么是半连接队列(SYN队列) 呢? 什么是全连接队列(ACCEPT队列) 呢?回忆下TCP三次握手的图:

  • TCP三次握手时,客户端发送SYN到服务端,服务端收到之后,便回复ACK和SYN,状态由LISTEN变为SYN_RCVD,此时这个连接就被推入了SYN队列,即半连接队列。
  • 当客户端回复ACK, 服务端接收后,三次握手就完成了。这时连接会等待被具体的应用取走,在被取走之前,它被推入ACCEPT队列,即全连接队列。

SYN Flood是一种典型的DDos攻击,它在短时间内,伪造不存在的IP地址,向服务器大量发起SYN报文。当服务器回复SYN+ACK报文后,不会收到ACK回应报文,导致服务器上建立大量的半连接半连接队列满了,这就无法处理正常的TCP请求。

那么有哪些方案应对呢?主要有 syn cookie和SYN Proxy防火墙等。