计算机网络的重要性不言而喻, 也是计算机基础里面关键的一环与面试热点, 之前收集了一些问题和知识点, 现在此分享
#针对目标
- 学完书本知识就忘记的我
- 本科网络工程但是对网络所知甚少的我
- 只偏向于工程应用而不热衷理论研究的我
- 不想在校招中裸奔的我
- 偶尔路过的你
#内容
计算机网络中热点面试问题, 我认为应该知道的一些基础知识; 不会深究太多, 以我认为够用为界
#网络分层
##七层参考模型
具体展开不再深入 - 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 链路层
- 物理层
##TCP ip模型
###应用层
注意事项:
在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。
Tcp ip中的数据流
应用层
定义数据格式,并按照对应的格式解读数据
应用层定义了各种各样的协议来规范数据格式
HTTP
FTP
比如http报文的头部格式
传输层
引入相关通信协议
定义端口
为了给每个应用程序标识身份
找到IP标定的主机上,具体接收数据的端口
UDP数据包
TCP数据包
网络层
IP地址
确认主机所在的网络位置,并通过IP进行MAC寻址
对外网数据包进行路由转发
在网络层被包装的数据包就叫IP数据包
网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由
链路层
MAC地址
链路层定义了主机的身份,即MAC地址
定义数据帧,确认主机的物理地址,传输数据;
在链路层生成以太网数据包
以太网数据包通过物理介质传输给对方主机
TCP协议
一些基本问题
TCP与UDP的区别
TCP面向连接
可靠的流协议
顺序控制
流量控制
拥塞控制
UDP
有更高的实时性
不可靠的数据报协议
不能保证一定会送达
为什么要三次握手?
三次握手的目的是建立可靠的通信信道
双方确认自己与对方的发送与接收是正常的
三次握手的过程
客户端发送syn包(seq=x)到服务器
客户端SYN_SEND状态,等待服务器确认
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包
服务器进入SYN_RECV状态
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),
此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
TCP四次握手
客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作
1.主动方申请关闭连接,发送FIN报文,意味着这一方没有要发送的数据了!
状态变为FIN-WAIT-1
2.被动方接收,发送ACK,先发送一个确认, ACK和ack
这时候还没有真正的发送完被动方的数据
状态变为CLOSE_wait
3.主动方状态变为FIN-wait2
被动方发送FIN, 意味着被动方也发送完了
LAST-ack状态
4.主动方发送确认,正式要关闭连接
主动方等待2MSL后,没有回复 关闭连接
TCP协议中的一些细节
tcp如何保证可靠性
使用如下技术
- 校验和
- 序列号
- 确认应答
- 重发控制
- 连接管理
- 窗口管理
####TCP怎么保证连接的唯一性
- TCP/IP唯一性含除地址和端口外, 还有一个时间上的标记才可完全确立。
- 对TCP而言在三次握手时的SYN标志会使用上一个ISN值
- 每一次连接都会分配到一个ISN值,连接双方对这个值会记录共识,假如这个值不一,就说明了这个连接已超时或无效
####TCP窗口的作用
- 进行流量控制的
- tcp的应答不是对每个段的
- 而是以一个更大的单位-窗口
####tcp 粘包拆包问题是怎么产生的?什么时候会发生? 怎么来解决?
- tcp的协议数据不会丢,没有收完包,下次接收,会继续上次继续接收,己端总是在收到ack时才会清除缓冲区内容。数据是可靠的,但是会粘包和拆包问题。(UDP不会发生粘包)
- 两种情况下发生粘包: 发送端需要等缓冲区满才发送出去,两个数据包太小了,造成粘包; 客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包.
- 两种情况下发生拆包:要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包; 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包
- 解决的关键: 接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕: 如何让接收端有办法知道哪里是终止.
- 方法1:发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
- 方法2:发送端将每个数据包封装为固定长度(不够的可以通过补0填充)
- 方法3:可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开
####TCP的拥塞控制
思路
为防止传输的阻塞,通过一个慢启动得到的数值来控制发送的数据量
发送方维持一个叫做拥塞窗口的状态变量
不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小
主要要记住的就是下面四个算法,
慢启动阶段
意思是刚刚加入网络的连接,一点一点地提速,不要一上来就把路占满。
把拥塞窗口设为1个数据段
指数性增加,直到第一次丢失
拥塞避免
到达一个阈值后,开始线性增加
快重传
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认
快恢复
和快重传算法配合使用,当发送方连续收到3个重复确认时就执行乘法减小算法,把慢开始门限ssthresh减半
但由于发送 方 连续 收到 几个重传确认,所以认为此事网络无阻塞,所以此时不执行慢开始算法,而是让cwnd 从 ssthresh开始执行拥塞避免算法(加法增大)。
##HTTP协议
什么是http协议?
是一个基于请求与响应模式的
无状态的
基于TCP的连接方式
应用层的协议
http请求方法
常用的方法有哪些?
get
post
get 和 post 请求有哪些区别?
get的参数在url中
post的通过request Body传递
GET请求在URL中传送的参数是有长度限制的
get重点在从服务器上获取资源
post重点在向服务器发送数据
get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
post较get安全性较高;
http请求报文和响应报文
请求报文
请求行
请求首部字段
请求实体
响应
状态行
响应首部字段
响应实体
http协议2.0和1.1的区别
HTTP/2是完全多路复用的
HTTP/2采用二进制格式而非文本格式
HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
header压缩
https的原理,如何加密解密
Https在真正请求数据前,先会与服务有几次握手验证,以证明相互的身份
客户端向服务器发起HTTPS请求,连接到服务器的443端口
服务器将自己的公钥发送给客户端
客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性
验证成功,生成随机的对称秘钥
客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器
服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密
这样两边就有了一对对称秘钥
之后就可以了
http常用状态码
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
200:请求被正常处理
204:请求被受理但没有资源可以返回
3xx:重定向--要完成请求必须进行更进一步的操作
301:永久性重定向
302:临时重定向
4xx:客户端错误--请求有语法错误或请求无法实现
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
5xx:服务器端错误--服务器未能实现合法的请求
500:服务器内部错误
503:服务器正忙