目录
- 前言
- 一、TCP协议 / UDP协议
- 二、HTTP协议
- 后记
前言
本篇主要介绍计算机网络的相关内容。
“基础知识”是本专栏的第一个部分,本篇博文是第六篇博文,如有需要,可:
- 点击这里,返回本专栏的索引文章
- 点击这里,返回上一篇《【Java校招面试】基础知识(五)——GC》
一、TCP协议 / UDP协议
1. 建立TCP连接为什么需要三次握手,两次可不可以,为什么?
三次握手的原因是确保双方都能够收发数据。两次握手的话,由于没有第三次确认,可能会出现以下情况:
- 客户端发送了连接请求,但是等待了一段时间后没有收到服务器的确认,于是认为连接失败,重新发送连接请求。但是这个时候第一次请求已经失效了,如果服务器在这个时候收到了第一个请求,就会误认为这是一个新的连接请求,从而建立了两条连接。
- 如果服务器发送了确认,但是没有收到客户端的确认,服务器就会认为连接建立失败,但是客户端依旧认为连接建立成功。这样服务器就会浪费资源,因为他认为这条连接已经建立成功,但是实际上并没有建立成功。
因此,通过三次握手,可以确保双方都能够收发数据,且正确初始化Sequence的值,sequence值标识两端传输的报文的序号,保证其不会乱序。避免了以上问题的发生。
02. TCP连接首次握手的风险
服务器收到客户机的SYN,回复SYN + ACK后未收到ACK确认。服务器会重发SYN + ACK直至超时,Linux下默认重试5次,间隔1s、2s、4s、8s、16s,在第5次发送至后等待32秒,直至共63秒后断开连接。
服务器会因此遭受 SYN Flood攻击风险。
SYN Flood攻击: 它利用TCP协议中的SYN包(同步包)来占用服务器资源。攻击者发送大量的SYN包给服务器,但不完成握手过程,从而耗尽服务器的资源,导致服务器无法响应合法的请求。这种攻击通常是通过多个IP地址或者使用伪造的IP地址来进行的,目的是使服务器无法正常工作,导致服务中断或者崩溃。
03. 针对SYN Flood攻击的防范措施
启用SYN Cookie: Linux下,SYN队列满后,通过tcp_syncookies
参数回发SYN Cookie。若为正常连接,客户机会回发SYN Cookie,即使队列已满也可以直接建立连接。这样就可以过滤掉大量的伪造连接请求,减轻攻击影响。
04. 建立TCP连接之后,如果客户机或服务器出现故障,会发生什么?
TCP连接具有保活机制。如果在一段保活时间内,连接处于非活动状态,则向对方发送保活探测报文,如果没有收到响应报文,就继续尝试,直到达到保活探测数,仍未收到响应则中断连接。
05. 断开TCP连接时,客户机TIME_WAIT状态的作用是什么?
TIME_WAIT状态是指在TCP连接关闭后,等待一段时间以确保所有的数据包都被接收或重传后才彻底关闭连接的状态。它的作用是防止已经关闭的连接后续的数据包干扰新的连接,避免出现“错误的连接”问题。在TIME_WAIT状态下,该连接的端口号仍然被保留,以便能够处理该连接的任何遗留数据。一般来说,TIME_WAIT状态持续时间为2倍的MSL(Maximum Segment Lifetime),MSL通常为2分钟。
06. 断开TCP连接为什么需要四次挥手?
为了确保数据能够完整传输。
断开TCP连接需要四次挥手的原因是因为TCP是全双工协议,即双方都可以向对方发送数据。在断开连接时,双方都要发送确认信息,以确保对方已经收到自己的断开请求。因此,需要四次挥手来完成断开连接的过程。
07. 服务器出现大量CLOSE_WAIT状态的TCP连接的原因
-
原因: 客户机关闭连接,但服务器忙于读或写数据,没有及时关闭连接。
-
解决方案:
1) 检查代码: 特别是释放资源的部分;
2) 检查配置: 特别是处理请求的线程配置。
08. TCP/IP模型与OSI七层模型的对比
OSI七层模型 | TCP/IP模型 | 功能 | 协议数据单元(PDU) | 对应协议 | 对应设备 |
---|---|---|---|---|---|
应用层 | 应用层 | 文件传输,电子邮件,虚拟终端 | 数据(data) | HTTP、FTP、SMTP、DNS、DHCP、SNMP、Telnet | 计算机 |
表示层 | 数据格式化,代码转换,数据加密 | ||||
会话层 | 建立或解除与别的节点的联系 | ||||
传输层 | 传输层 | 提供端对端的连接 | 段(segment) | TCP、UDP | |
网络层 | 网络层 | 为数据包选择路由 | 包(package) | IP、ICMP、RIP、OSPF、BGP、IGMP | 路由器 |
数据链路层 | 链路层 | 传输有地址的帧,错误校验 | 帧(frame) | SLIP、CSLIP、PPP、ARP、RARP、MTU | 交换机、网桥 |
物理层 | 以二进制形式在物理媒介上传输数据 | 比特(bit) | ISO2110、IEEE802、IEEE802.2 | 中继器、集线器 |
09. TCP协议如何实现可靠的传输?
1) 数据分段并编号: 应用数据被分成一个或多个TCP段,每个段都有一个序号
和确认号
。接收方使用这些号码来确认已收到的数据和请求缺失的数据。
2) 校验和: TCP协议使用校验和
来检测数据是否被损坏或篡改。如果数据被发现损坏或篡改,TCP会丢弃该数据,并要求重新发送。
3) 确认重传机制: 发送方使用超时重传机制来确保数据能够到达接收方。如果发送方没有收到确认信息,就会重传该数据。
4) 流量控制: 发送方和接收方都维护一个拥塞窗口
大小的变量,以确保网络不会过载。如果网络拥塞,发送方会减小窗口大小,从而减少发送的数据量。
5) 拥塞控制: 通过监控网络的拥塞状态,动态调整数据传输速度
和数据包发送频率
,以避免网络拥塞和丢包,从而保证数据传输的可靠性和高效性。
10. 确认重传机制是什么?
在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
-
累计确认: 累计确认就是TCP协议的确认方法,TCP使用可变长度报文段来发送数据,重传时,报文段数据可能会比原报文段数据包含更多的数据,因此对数据报和报文段无法进行简单的确认。TCP使用流序号对流中的一个位置进行确认,即序号和确认号一一对应,接收方使用序号将报文段重新排序,且以
正确接收到的流的最长连续前缀
进行确认。 -
超时重传: 超时时间计算是开启定时器的设定时间,从而保证网络资源利用率,避免因定时器的时间(RTO)不确定而影响网络传输效率。
-
快速重传: 要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。
11. 流量控制中的滑动窗口协议是什么?
滑动窗口协议是一种流量控制机制,用于确保发送方和接收方之间的数据传输的可靠性。
其工作流程如下:
1) 发送方将数据分成多个数据包,并按顺序发送给接收方。
2) 接收方在接收到数据包后,将其存储在缓冲区中,并向发送方发送确认消息(ACK),表示已成功接收。
3) 发送方收到确认消息后,将窗口向前滑动一个位置,表示已成功发送了一个数据包,并准备发送下一个数据包。
4) 如果接收方未能接收到数据包,则不会发送确认消息。发送方会等待一段时间,如果仍未收到确认消息,则会重新发送该数据包。
5) 发送方的窗口大小取决于接收方的缓冲区大小。如果接收方的缓冲区已满,则发送方会停止发送数据包,直到接收方空出缓冲区。
6) 如果在数据传输过程中发生丢包或错误,发送方会收到接收方的重传请求,并重新发送丢失的数据包。
7) 如果发送方没有收到确认消息或重传请求,则会重新发送数据包,直到接收方确认已成功接收。
12. 接收窗口和发送窗口大小一样吗?设置越大越好吗?
接收窗口
一般 >= 发送窗口
,但不是越大越好。当接收窗口大到一定程度,非但对降低丢包率的不会有更大的影响,反而会增大内存消耗。
13. UDP协议的特点
1) 面向非连接;
2) 不维护连接状态,支持同时向多个客户端传输相同的消息;
3) 数据包报头只有8个字节,额外开销较小;
4) 吞吐量只受限于数据生成速率、传输速率传输速率以及机器性能;
5) 尽最大努力交付,不保证可靠交付,不需要维护复杂的链接状态表;
6) 面向报文,不对应用程序提交的报文信息进行拆分或者合并。
14. TCP协议和UDP协议的区别
协议 | 是否面向连接 | 可靠性 | 有序性 | 速度 | 量级 | 适用场景 |
---|---|---|---|---|---|---|
TCP | 是 | 可靠 | 有序 | 慢 | 重量级 | 上传、下载文件等需要传输的数据具有高可靠性的场景 |
UDP | 否 | 不可靠 | 无序 | 快 | 轻量级 | 视频流、音频流传输这类要求快、流畅、但数据可靠性要求不是很高的场景 |
二、HTTP协议
HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超文本数据的协议。它是一种客户端-服务器协议,客户端通过发送HTTP请求与服务器交互,服务器通过发送HTTP响应来响应客户端请求。HTTP协议是基于TCP/IP协议的,HTTP请求和响应的数据都是通过TCP连接传输的。HTTP协议是Web应用程序的基础,通过HTTP协议,浏览器可以获取Web服务器上的各种资源,如网页、图片、视频、音频等。
01. HTTP协议的主要特点
1) 支持支持额客户/服务器模式
2) 简单快速
3) 灵活,允许传输任意类型的数据对象。
4) 无连接,限制每次连接只处理一个请求,服务端处理完请求并收到客户端的应答之后就断开连接。
5) 无状态
02. 一个HTTP请求从发起请求到响应的过程
1) 客户端和服务端TCP端口(默认端口号80)建立一个TCP套接字连接;
2) 客户端发送HTTP请求;
3) 服务端接收请求并返回HTTP响应;
4) 服务端释放TCP连接(1.0版本中使用close方式,服务端直接断开连接;1.1中使用keep alive,服务端会保持连接一定的时间,在此期间客户端可以继续发送请求);
5) 客户端解析HTTP响应内容。
03. 在浏览器地址栏输入URL,按下回车键之后经历的流程
1) DNS解析: 浏览器根据URL逐层查询DNS缓存,解析域名所对应的IP地址。DNS缓存由近到远依次是:浏览器缓存、本地缓存、路由器缓存、IPS服务器缓存、根域名服务器缓存、顶级域名服务器缓存。
2) 建立TCP连接: 根据IP地址和对应的端口号建立TCP连接(三次握手)。
3) 发送HTTP请求;
4) 服务器处理请求并返回包含页面信息的HTTP响应;
5) 浏览器收到响应,解析渲染页面;
6) 断开HTTP请求: 浏览器释放TCP连接(四次挥手)。
04. 常见的HTTP状态码
- 1xx: 指示信息,表示请求已接收,继续处理
- 2xx: 成功,表示请求已被成功接收、理解、接受
- 200, OK: 正常返回信息
- 3xx: 重定向,要完成请求必须进行更进一步的操作
- 301, 永久重定向: 请求的资源永久分配了新的url,以后应使用新url
- 302, 临时重定向: 请求的资源临时分配了新的url
- 4xx: 客户端错误,请求有语法错误或请求无法实现
- 400, Bad Request: 客户端请求有语法错误,不能被服务器理解
- 401, Unauthorized: 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
- 403, Forbidden: 服务器收到请求,但是拒绝提供服务
- 404, Not Found: 请求资源不存在
- 5xx: 服务器错误,服务器未能实现合法的请求
- 500, Internal Server Error: 服务器发生了不可预期的错误
- 503, Server Unavailable: 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
05. 常用的HTTP请求method
HTTP请求的method有GET
、POST
、HEAD
、OPTIONS
、PUT
、PATCH
、DELETE
、TRACE
和CONNECT
,最常用的是POST
和GET
。
- 区别:
1) HTTP报文层面: GET将请求参数放在URL
中,POST放在报文体(即Body
)中。
2) 幂等性: 符合密等性的请求,请求一次和请求多次的结果一致。使用GET的请求应该符合幂等性,使用POST的请求应该不符合幂等性。
3) 其他层面: 使用GET的请求可以被缓存、被存储(因为参数都在URL中),而POST不行。
06. Cookie和Session的区别
-
Cookie
由服务器发给客户端的特殊信息,以文本的形式存放在客户端。客户端再次请求的时候,会把Cookie回发。服务器接收后,会解析Cookie生成与客户端相对应的内容。 -
Session
服务端的机制,在服务器上保存的信息。解析客户端请求并操作session id,按需求保存状态信息。 -
区别
- Cookie数据存放在客户端,Session存放在服务端;
- Session相对于Cookie更安全;
- 若考虑减轻服务器负担,可以使用Cookie。
07. HTTP和HTTPS的区别
由于HTTP使用明文传输数据,不具备安全性。HTTPS引入了SSL(Security Socket Layer,安全套接字层)来堆传输的数据进行加解密。
-
SSL:
- 为网络通信提供安全及数据完整性的一种安全协议;
- 位于TCP与应用层之间,是操作系统对外的API,SSL3.0后更名为TLS;
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性。
-
区别:
- HTTPS需要到CA申请证书,HTTP不需要;
- HTTPS密文传输,HTTP明文传输;
- 连接方式不同,HTTPS默认使用
443
端口,HTTP使用80
端口; - HTTPS = HTTP + 加密 + 认证 + 完整性保护,比HTTP安全。
08. HTTPS传输数据的流程
1) 浏览器将支持的加密算法信息发送给服务器;
2) 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器;
3) 浏览器验证证书合法性,并结合证书公钥加密信息加密信息发送给服务器;
4) 服务器使用私钥解密信息,验证哈希,加密响应信息回发浏览器;
5) 浏览器解密响应信息,并对信息进行验证,之后进行加密交互数据。
09. socket
是对TCP/IP协议的抽象,是操作系统对外开放的接口
socket通信的流程:
1) 创建socket: 首先要创建一个socket对象,该对象表示一个通信的端点,需要指定协议和地址族。
2) 绑定地址: 将socket绑定到一个具体的IP地址和端口上,以便其它的进程能够找到它。
3) 监听连接: 如果是服务器端,需要调用listen函数,来监听客户端的连接请求。
4) 接收连接: 当客户端请求连接时,服务器端会调用accept函数,来建立一个新的socket对象,用于与客户端进行通信。
5) 发送和接收数据: 用send函数来发送数据,用recv函数来接收数据。
6) 关闭连接: 通信结束后,需要调用close函数来关闭socket。
以上就是socket通信的基本流程。不同的协议或应用场景下,会有一些特别的处理,但基本流程是大致相同的。
后记
计算机网络相关的知识点是非常复杂多样的,汇聚了成千上万的先哲在开拓道路上的发现、研究和试验结果。上学的时候我们需要用一个学期去学完一本厚厚的书。因此这里不可能详尽得照搬书中的所有内容,仅将面试中的高频考点提出来列举在这里。如果想要系统化地学习计算机网络相关的知识,建议买一本书来读。