题目来源牛客网文章——《感谢牛客网!发一波面经!》
索引:
Q | Title |
---|---|
1 | 计算机网络分为哪几层 |
2 | TCP与UDP |
3 | 窗口滑动协议,快速重传,拥塞避免,慢启动 |
4 | TCP握手、挥手 |
5 | 输入域名访问网站发生了什么? |
6 | 什么是https协议,用到哪种密钥? |
7 | 什么是socket? |
8 | 什么是IO,什么是NIO,什么是AIO,什么是netty框架? |
Q1:计算机网络分为哪几层?
OSI七层:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
TCP/IP:
序号 | OSI | 序号 | TCP/IP | 序号 | 五层协议 |
---|---|---|---|---|---|
7 | 应用层 | 4 | 5 | ||
6 | 表达层 | 4 | 5 | ||
5 | 会话层 | 4 | 应用层(各种应用层协议如TELNET,FTP,SMTP等) | 5 | 应用层 |
4 | 运输层 | 3 | 运输层(TCP/UDP) | 4 | 运输层 |
3 | 网络层 | 2 | 网络层 IP | 3 | 网络层 |
2 | 数据链路层 | 1 | 2 | 数据链路层 | |
1 | 物理层 | 1 | 网络接口层 | 1 | 物理层 |
一、应用层(application layer)
通过进程间交互完成特定网络应用。应用层协议定义的是应用进程间通信和交互规则。常用的有域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。应用层交互的数据单元称为报文。
域名系统DNS(Domain Name System)
将域名和IP地址相互映射的分布式数据库。
HTTP协议
超文本传输协议是互联网上使用最广泛的网络协议,所有WWW文件都必须遵守。
二、运输层(transport layer)
向两台主机进程间通信提供通用的数据传输服务。应用进程通过该服务,传送应用层报文。有复用和分用功能。
复用
多个应用层进程同时使用下面运输层服务
分用
运输层把收到的信息分别交付上面应用层中相应进程。
主要协议
TCP
- 面向连接(类似于打电话,通话前拨号建立连接,结束后挂机释放听筒)
- 可靠的数据传输服务
- 只支持点对点(一对一)的连接
- 通信双方均可以发送数据,连接两端均有发送接收缓存,可以临时存放双方通信数据。
- 面向字节流。虽然应用每次交互是发送数据块,但TCP仅将其看做无结构字节流。
UDP
- 无连接的
- 尽最大努力的数据传输服务(不保证数据传送的可靠性)
- 面向报文
- 没用拥塞控制,因此网络出现拥塞不会导致原主机发送速率降低(实时应用中,如电话、视频会议等)
- 支持一对一,一对多,多对一和多对对的交互通信
- 首部开销小,只需要8字节,比TCP20字节首部短很多
三、网络层(network layer)
网络层负责为分组交换网上不同主机提供通信服务。
无论哪一层的数据单元,都可以笼统称为“分组”
网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。由于TCP/IP体系中,网络层使用IP协议,所以分组也叫IP数据报或数据报。
网络层通过路由器将运输层传递的分组传给目标主机。
四、数据链路层(data link layer)
两台主机间数据传输,总是在一段一段链路上传送的,这就需要使用专门的数据链路层协议。两个相邻节点间传数据时,数据链路层将网络层叫下来的IP数据报组装成帧,在两个相邻节点间链路上传送帧。每一帧包括数据和必要的控制信息(同步信息,地址信息,差错控制等)
通过控制信息,接收端可知道具体的始末比特位,提取出数据部分,上交网络层。
通过差错控制,如果检测到收到的帧有误差,数据链路层简单丢弃这个出差错帧,避免浪费资源
五、物理层(physical layer)
传送单位比特
实现相邻计算机节点间比特流的透明传送,尽可能屏蔽具体传输介质和物理设备差异。透明传送指的是经过电路传送后,比特流没有发生变化。
附加:表示层和会话层
表示层:网络层与应用层之间的翻译官,进行语言转换编码转换等
会话层:利用传输层服务,建立和维持会话。感觉类似于断点续存的存档点,大文件传输的时候,如果会话中断了,通过会话层可以从校验点重新开始会话。
Q2:TCP与UDP
差异
7点差异
TCP | UDP | |
---|---|---|
连接 | 面向连接 | 无连接 |
可靠性 | 可靠,无重复无丢失无差错按序到达 | 尽可能传送 |
传输内容 | 面向字节流 | 面向报文 |
连接个数 | 点对点 | m对n |
首部 | 20字节 | 8字节 |
逻辑通信信道 | 全双工可靠 | 不可靠 |
传输效率 | 慢 | 快 |
应用场景
TCP | UDP | |
---|---|---|
特点 | 完整性>实时性 | 完整性<实时性 |
举例 | 文件传输、重要状态更新 | 实时通信、实时视频 |
哪些应用层协议使用
TCP | UDP | |
---|---|---|
FTP | 文件传输协议 | |
Telnet | 远程登录端口 | |
SMTP | 邮件传输协议 | |
POP3 | 与SMTP相关,接收邮件 | |
HTTP | 从web服务器传输超文本到本地浏览器 | |
DNS | 将域名解析为IP地址 | |
SNMP | 管理网络设备,由于设备多,所以用UDP | |
TFTP | 简单文件传输协议 |
Q3:窗口滑动协议,快速重传,拥塞避免,慢启动
窗口滑动协议
1. 停止等待协议
发送方发送一个数据帧后,等待确认消息,若收到ACK,则继续传,否则超时或收到NAK,重传数据帧
2. 后退N帧协议(GBN)
发送方连续发送W个数据帧,等待确认消息,如果收到ACK,继续传,否则从错误位置,重新传送W个数据帧(无论是否发送过)
3. 选择重传协议(SR)
发送方连续发送W个数据帧,等待确认消息,如果出现错误,将后续正确的帧在缓存中储存,发送方从错误位置,重新发送,接收方将缓存中正确帧和新收到正确帧组合,发送对应ACK信息,如果该问题已经修复,发送方根据ACK信息,确定新的发送起始位置
拥塞控制
参考资料《TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免》,个人感觉这个贼详细
防止过多的数据注入网络
发送方维持一个拥塞窗口cnwd,一个慢开始门限ssthresh
慢启动
由于不知道网络的承受能力,所以一开始的时候cnwd=1
每次收到cnwd个ACK消息以后,cnwd就翻倍
慢启动指的就是一开始cnwd=1,初始慢,但逐渐加快的过程
拥塞避免
当cnwd >= ssthresh之后,指数爆炸式的上涨就有些快了
改为拥塞避免的方式,即限定每cnwd个ACK消息后,cnwd++
这样是成比例的平滑缓慢增长。
网络拥塞
如果出现了网络拥塞(没收到ACK标志),无论在慢启动阶段汉氏拥塞避免阶段。
ssthresh = 当前cnwd / 2
cnwd=1,等于是重新开始试探网络的承载能力
快速重传
接收方每收到一个失序的报文,就返回一个重复确认值
如果发送方连续收到3个重复确认值,认为该报文丢失,重新发送
此时ssthresh = cnwd = 当前cnwd / 2
然后继续进行拥塞避免的每周期+1。
Q4:TCP握手、挥手
三次握手
- 客户端发送SYN包到服务器,SYN = X,进入SYN_SEND状态
- 服务器收到SYN包,返回确认包ACK与新的SYN包。ACK = X + 1;SYN = Y。进入SYN_RECV状态
- 客户端收到SYN+ACK包,返回确认包ACK,ACK = Y + 1。进入ESTABLISHED状态。服务器收到ACK包,也进入ESTABLISHED状态
四次挥手
- 客户端发送SYN+FIN报文段,SYN = X,客户端进入FINISH_WAIT_1状态,意味着不需要再传信息了
- 服务器收到FIN报文段,返回确认包ACK = X + 1,客户端进入FINISH_WAIT_2状态,此时就是等待服务器传最后的消息
- 服务器传送完毕后,发送SYN+FIN报文段,说明他也做好了关闭准备,SYN = Y。然后进入LAST_ACK阶段,等待客户端确认
- 客户端收到后,返回ACK = Y + 1,进入TIME_WAIT阶段。服务器收到ACK包,正常关闭。如果2MSL后仍未有新消息,说明服务器正常关闭,客户端也关闭。
为什么是3和4
3:发起人先发一次,然后互相确认听得到
4:客户端说完了,但是服务器可能还想叨叨一会儿。2次用来反馈客户端离开请求。2次用来反馈服务器离开请求。
为什么是2MSL
MSL是Maximum Segment Lifetime,最大报文生存时间。
客户端返回ACK后,一个MSL的时间里,这个ACK必然消失了,如果服务器没收到,此时应该已经发送了重复确认信息
又一个MSL之后,重复确认信息也必然消失了。还是什么也没收到,说明服务器没有发这个消息,说明正常关闭了。
通俗的演绎
A:喂?听得到吗?
B:听得到,你呢?
A:听得真真儿的,哎对了……
……一通扯闲天
A:哎哟我得去洗澡了伙计
B:哎等等我说完这个
叽里呱啦
B:哎好了,没事儿了,挂了吧
A:成,拜拜?
B1(悄咪咪挂电话了)等了几秒A也挂电话了
B2(没挂电话):你怎么不挂电话啊?
A:你先挂!
Q5:输入域名访问网站发生了什么?
- 浏览器查找域名的IP地址
先查浏览器缓存,没有再查路由器缓存,再查DNS缓存,再没有往上层DNS查找 - 使用TCP协议,建立TCP连接
建立连接前,先要找到对应的路径。
IP协议定义了出发地和目的地的IP。
OSPF(Open Shortest Path First)开放式最短路径优先决定了经过哪些路由器
ARP计算中间节点地址,将IP转换为MAC地址 - 用HTTP协议请求网页内容
cookies也会一起发给服务器 - 服务器收到HTTP请求,进行处理
(J2EE见下方引申) - 服务器发回一个HTML响应
- 浏览器显示HTML
J2EE引申
当WEB客户把HTTP请求发给Servlet容器会发生什么?
- WEB客户向Servlet容器发送HTTP请求
- Servlet容器接收到HTTP请求
- Servlet容器创建一个HttpRequest对象,在对象中封装HTTP信息
- Servlet容器创建一个HttpResponse对象
- Servlet容器把HttpRequest和HttpResponse作为参数,调用HttpServlet的service方法
- service方法中,根据request的mothod是GET还是POST决定调用doGet还是doPost
- HttpServlet调用HttpRequest有关方法,获得HTTP信息
- HttpServlet调用HttpResponse有关方法,获得响应信息
- Servlet容器将响应结果返回给WEB客户
Q6:什么是https协议,用到哪种密钥?
https = http + ssl/tls
http协议具有明文发送的特点,容易被窃听,篡改,劫持
tls/ssl具有信息加密,身份验证,完整性验证等特点。可以解决上述问题
共享密钥加密(对称密钥加密)
加密和解密用同一个密钥
公开密钥加密(非对称密钥加密)
每个人拥有一对公钥+私钥
别人使用你的公钥加密文件后发给你,你用私钥解密阅读
混合密钥加密
交换密钥的时候使用公开密钥加密。传送报文的时候采用共享密钥加密
Q7:什么是socket?
socket是对TCP/IP协议的封装,是应用层和TCP/IP协议族通信的中间抽象层。是一组调用接口
Q8:什么是IO,什么是NIO,什么是AIO,什么是netty框架?
IO
输入输出设备及输入输出接口
BIO
无论IO是否准备好,线程阻塞等待接收IO信息或使用IO信息
NIO
非阻塞IO,IO未准备好时,线程继续做别的事情。准备好后,调用回调函数,线程阻塞开始执行IO操作
AIO
线程发起后,立即返回。准备好后,执行IO操作,然后调用回调函数,告知线程IO操作结果
netty框架
很棒的一个通俗解释《小白科普:Netty有什么用?》