1 计算机网络
1 常见问题
1、对IP地址分类的理解?
总结:
IP地址,是指网路地址协议,是IP协议给每一个网络和每一台主机分配的逻辑地址,代替物理地址。IP地址,分为5类,分别为:
A类地址,二进制以0开头,范围为 0~127;
B类地址,二进制以10开头,范围为 128~191;
C类地址, 二进制以110开头,范围为 192~223;
D类地址,二进制以1110开头,范围为 224~239;
E类地址, 二进制以111开头
2、TCP和UDP的主要特点?
总结:
TCP:
- 面向连接
- 一对一
- 可靠
- 全双工通信,既可以收又可以发
- 面向字节流。虽然TCP数据是数据块,但是TCP将其看做一连串的无结构字节流来处理
UDP:
- 无连接
- 支持一对一、一对多,多对多
- 不确保可靠,尽最大努力交付
- UDP也是全双工通信
- 面向数据报
- 没有拥塞控制,在对实时应用很有用
3、TCP和UDP的区别?
总结:
TCP是可靠传输,UDP是不可靠传输。TCP的可靠主要依赖于TCP三次握手建立通信,还有窗口、重传、拥塞控制等机制,所以TCP通信资源消耗较大;
UDP虽然是不可靠传输,但是传输开销小,没有拥塞控制,在实时应用上最有效,一般用于即时通信和直播等。
4、详细说下TCP和UDP分别对应的常见应用协议有哪些?
总结:
TCP 常见应用协议:
- HTTP web服务器的超文本传输协议
- SMTP 简单邮件传送协议
- FTP 文件传输协议
- telnet 远程登录协议
UDP 常见应用协议:
- DNS 域名解析协议
- SNMP 简单网络管理协议
- TFTP 简单文件传输协议
5、详细说下TCP三次握手的过程?
总结:
1、第一次握手,客户端向服务端发送SYN包表示希望建立连接,证明客户端具备发送能力;
2、第二次握手,服务端向客户端发送SYN-ACK包,证明自己具备接收能力和发送能力,并表示已收到SYN包,并确认可以建立连接;
3、第三次握手,客户端收到SYN-ACK包后,向服务端发送ACK包,证明具备接收能力,并表示已收到SYN-ACk包,并确认连接建立成功。
至此,双方建立可靠的TCP连接。
6、为什么不是2次握手也不是4次握手?
总结:
通过三次握手,可以确保双方都能发送和接收数据,同时避免已失效的链接占用通道。
为什么不是2次握手?
防止失效的连接请求报文段被服务端接收,从而产生错误。
PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。
此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。
此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。
但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
为什么不是4次握手?
通过三次握手,可以确保双方都能发送和接收数据
7、详细说下TCP四次挥手的过程?
总结:
1、第一次挥手,客户端的应用先向服务端发送连接释放报文段,并停止再发送数据,主动关闭TCP连接;
2、第二次挥手,服务端收到连接释放报文段之后立即发出确认,这个时候TCP处于半关闭状态,也就是客户端不再发送数据;
3、第三次挥手,服务端可以继续发送没发完的数据,等到服务端发送完剩下数据后,向客户端发送释放连接,这时候服务端等待客户端的确认;
4、第四次挥手,客户端收到服务端的释放连接后,发出确认报文,服务端结束TCP连接,客户端再等待2MSL之后,结束TCP连接,到此整个TCP结束。
客户端等待2MSL的时间,为什么?
1、确保客户端的最后一个报文能够到达服务器,如果超时未送达,在2MSL时间范围内可以收到服务器重传信息并进行重新确认;
2、使本连接持续时间范围内的所有报文段都消失,不再出现在下一个连接中。
为什么第二次和第三次挥手不能合并?
第二次挥手,只是进行半关闭状态,这时候客户端不再发送数据,但是服务器还可以继续发送没有发送完的数据,所以不能合并。
8、TCP是如何保证可靠传输的?
总结:
简单来说,TCP的可靠主要依赖于TCP三次握手建立通信,还有窗口、重传、拥塞控制等机制。
展开来说就是:
1、确认和重传:停止等待协议,接收方接收到报文就会确认,发送方如果超时没有收到确认报文就会重传;
2、数据校验;如果数据校验有问题,则丢弃报文并等待发送方超时重发
3、数据合理分片和排序:tcp会按MTU(最大传输单元)合理分片,接收方会缓存未按序到达的数据,重新排序后再交由应用层;
4、流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失,用到滑动窗口机制;
5、拥塞控制:当网络拥塞时,减少数据的发送。
参考:https://www.cnblogs.com/huajiezh/p/6593425.html
9、详细说说停止等待协议?
总结:
停止等待协议:
目的是为了实现可靠传输,基本原理是
“发送方每发送一帧后就要停下来等待接收方的确认返回,仅当接收方确认正确接收后再继续发送下一帧。
如果接收方收到重复分组,丢弃该分组,但同时还要发送确认。”
参考:https://blog.youkuaiyun.com/2302_78764748/article/details/132492835
10、谈谈对ARQ协议的理解?
总结:
ARQ(Automatic Repeat reQuest) 自动重传请求
停止等待协议中,超时重传协议规定只要超时仍然没有收到确认,就重传之前发送的分组(也就是认为之前的丢失了)。
因此每次发送完分组都要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些,这种自动重传方式常称为自动重传请求ARQ。
连续ARQ协议
连续ARQ协议目的是提高信道利用率。
发送方维持一个窗口,只要在这个窗口内的分组都可以连续发送,不需要等待确认再发下一个;
接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
11、谈谈对流量控制和TCP拥塞控制的理解?
总结:
流量控制:
流量控制是指,当接收方数据处理不过来时,反馈给发送方降低发送速率,防止丢包;
常用'滑动窗口'实现流量控制。滑动窗口是一种流量控制技术,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。
发送方可以通过滑动窗口的大小来确认还可以发送多少数据。
接收方通过确认报文中的窗口字段可以控制发送方窗口大小,从而达到流量控制的目的。
拥塞控制:
拥塞控制和流量控制都是为了防止数据量超过接收方处理极限,实现可靠传输,不同的是,拥塞控制是全局性的,流量控制的点对点通信的控制。
拥塞:如果在某段时间范围内,网络中对某个资源的请求超过改资源能提供的承载上限,网络的性能就要变坏,这种请求就叫拥塞。
拥塞控制,为了避免过多的数据注入到网络中,使网络中的路由器或链路不致于过载,TCP发送方维持一个拥塞控制窗口(cwnd)的状态变量。
cwnd的大小取决于网络的拥塞程度,并且动态变化。 Swnd = min(rwnd, cwnd); Swnd:发送窗口,rwnd:接收窗口, cwnd:拥塞窗口。
TCP四种算法: 慢开始、拥塞避免、快重传和快恢复
ssthresh: 处理拥塞参考参数
慢开始: cwnd<ssthresh,cwnd以慢开始的方式指数增长;
拥塞避免: cwnd>ssthresh,cwnd以拥塞避免的方式加法增长;
快重传:收到三个同样的确认后就立即重传,不等到超时;
快恢复:cwnd不是从1重新开始。
参考:https://www.cnblogs.com/huajiezh/p/6593425.html
12、谈谈TCP粘包的理解?
总结:
1、什么是粘包?
简单来说就是一个包中包含两个数据包的信息,这种情况就叫做粘包。
2、粘包是如何产生的?
发送方产生粘包:
采用TCP连接传输数据的客户端和服务器经常保持一个长连接的状态(一次发送一个包不会存在粘包),可以持续传数据;
当发送数据过小的时候,TCP会把较小的数据包进行合并,这个过程发送在缓冲区。
接收方产生粘包:
接收方将接收到的数据放到缓冲区,接收方放数据的速度>应用层拿数据的速度的时候, 下一个数据会放在上一个数据的末尾,取数据的时候就是一个粘包了。
3、如何解决粘包?
- 特殊字符控制
- 在包头首部添加数据包的长度
另外,Netty有专门的编码器和解码器来解决拆包和粘包的问题。
UDP没有粘包的问题,因为发送的时候用户数据包既不合并,也不合并。
13、说说对HTTP的理解?
总结:
1、常见状态码有:
1XX 信息
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误
2、常见的HTTP方法有哪些?
GET、POST、PUT、HEAD、OPTIONS
GET请求:获取资源
POST:传输实体数据
PUT:上传文件或修改,一般不用
HEAD: 获取请求报文首部
OPTIONS: 查询指定URL支持的方法
3、GET请求和POST请求的区别?
本质都是HTTP请求,不同的是
- 功能不同:GET请求用于获取资源,POST请求用于传输实体数据;
- 幂等性不同:GET请求每次同一个资源都能获取到相同的数据,而POST请求不是幂等的,每次请求对数据的修改是不同的;
- 请求参数形式不同: GET请求把参数放到URL上,以?分隔,POST请求把数据放置到HTTP报文的请求头中;
- 安全性不同: 因为请求参数形式不同,POST请求安全性更高;
- 请求大小不同: 一般而言,GET请求长度是受限于URL长度,而POST请求没有大小限制。
14、在浏览器输入URL地址到显示主页的过程?
总结:
前端输入->DNS解析获取IP-> TCP连接->发送HTTP请求->服务器处理请求并返回HTTP报文->浏览器解析渲染页面->TCP连接释放
15、DNS解析过程?
总结:
DNS解析是域名转ip的过程。步骤:
1、用户输入域名,
2、本地DNS缓存查询,
3、本地Hosts文件查询,
4、本地域名服务器递归查询,转发器(运营商DNS服务器)迭代查询
5、返回结果更新本地缓存,
6、浏览器访问
参考:https://blog.youkuaiyun.com/weixin_69884785/article/details/130219175
总结就是:
1、主机向本地域名服务器的查询是递归查询,如果本地域名服务器不知道该域名的ip,本地域名服务器就作为DNS客户端向根域名服务器
发出查询请求报文,而不是让主机迭代查询。
2、本地域名服务器向根域名服务器的查询是迭代查询,如果根域名服务器不知道该域名的ip,会返回下一个域名服务器让本地域名服务器迭代查询。