TCP/IP 五层模型
- 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。
- 数据链路层:将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。交换机
- 网络层:选择合适的路由和交换结点,确保数据及时传送。IP协议,路由器
- 传输层:负责向两台主机进程之间的通信提供数据传输服务。TCP、UDP
- 应用层:为应用程序提供交互服务。DNS、HTTP协议、SMTP协议
TCP与UDP区别
- TCP是可靠传输,UDP是不可靠传输。
- TCP面向连接,UDP无连接,即发送数据之前不需要建立连接。
- TCP传输数据有序,UDP不保证数据的有序性。
- TCP面向字节流,UDP是面向报文的。
- TCP传输速度相对UDP较慢。
- TCP首部20字节,UDP首部8字节。
- TCP连接只能是一对一的(端到端);UDP支持一对一、一对多、多对一和多对多的通信方式。
基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH
基于UDP的应用层协议:DNS、SNMP、NFS
TCP 如何保证可靠传输
- 数据包校验
- 对失序数据包重排序
- 丢弃重复数据:对于重复数据,能够丢弃重复数据;
- 应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
- 超时重传
- 流量控制:滑动窗口(滑动窗口是根据接收方数据缓冲区大小确定的)
- 拥塞避免(拥塞窗口是根据网络的拥塞情况动态确定的):慢开始,拥塞避免,快重传,快恢复
- ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
ARQ
包括停止等待ARQ协议和连续ARQ协议。
停止等待ARQ协议
- 停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复ACK)。如果过了一段时间(超时时间后),还是没有收到ACK确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;
- 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
连续ARQ协议
连续ARQ协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。比如:发送方发送了5条消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫Go-Back-N(回退N),表示需要退回来重传已经发送过的N个消息。
拥塞控制过程
- 慢开始:为了避免一开始发送大量的数据而产生网络阻塞,会先初始化cwnd为1,当收到ACK后到下一个传输轮次,cwnd为2,以此类推成指数形式增长。
- 拥塞避免:因为cwnd的数量在慢开始是指数增长的,为了防止cwnd数量过大而导致网络阻塞,会设置一个慢开始的门限值ssthresh,当cwnd>=ssthresh时,进入到拥塞避免阶段,cwnd每个传输轮次加1。但网络出现超时,会将门限值ssthresh变为出现超时cwnd数值的一半,cwnd重新设置为1,如上图,在第12轮出现超时后,cwnd变为1,ssthresh变为12。
- 快重传:在网络中如果出现超时或者阻塞,则按慢开始和拥塞避免算法进行调整。但如果只是丢失某一个报文段,如下图(图片来源于网络),则使用快重传算法。但是根据快重传算法,要求在这种情况下,需要快速向发送端发送M2的确认报文,在发送方收到三个M2的确认报文后,无需等待重传计时器所设置的时间,可直接进行M3的重传,这就是快重传。
4. 快恢复:从上上图圈4可以看到,当发送收到三个重复的ACK,会进行快重传和快恢复。快恢复是指将ssthresh设置为发生快重传时的cwnd数量的一半,而cwnd不是设置为1而是设置为为门限值ssthresh,并开始拥塞避免阶段。
TCP粘包现象原因和解决方法
原因:
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。
解决办法:
- 消息定长。发送端将每个数据包封装为固定长度(不够的可以通过补0填充)。
- 设置消息边界。服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如FTP协议。
- 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段。
TCP三次握手
为什么TCP连接的时候是3次?两次是否可以?
- 假设建立TCP连接仅需要两次握手,那么如果第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且可能向服务端已经开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。
- 如果服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。
四次挥手
为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?
- 客户端发送第四次挥手中的报文后,再经过2MSL,可使本次TCP连接中的所有报文全部消失,不会出现在下一个TCP连接中。
- 考虑丢包问题,如果第四挥手发送的报文在传输过程中丢失了,那么服务端没收到确认ack报文就会重发第三次挥手的报文。如果客户端发送完第四次挥手的确认报文后直接关闭,而这次报文又恰好丢失,则会造成服务端无法正常关闭。
浏览器输入URL并回车的过程
- 输入网址:输入要访问的网址,即URL。
- 缓存解析:浏览器获取URL后,先去缓存中查找资源,从浏览器缓存-系统缓存-路由器缓存中查看; 如果有就从缓存中显示界面,不再发送请求; 如果没有,则发送HTTP请求。
- 域名解析:发现缓存中没有资源,发送HTTP请求; 在发送HTTP请求之前,需要进行DNS解析(域名解析); DNS解析:域名到IP地址的转换过程,域名的解析工作由DNS服务器完成,解析后可以获取域名相应的IP地址。(主机向本地域名服务器的查询一般是采用递归查询,而本地域名服务器向根域名的查询一般是采用迭代查询。)
- TCP连接:三次握手在域名解析后,浏览器向服务器发起了HTTP请求,TCP连接;因为TCP协议时面向连接的,所以在传输数据前必须建立连接,即三次握手;TCP连接建立后,浏览器开始向服务器发送HTTP请求报文。
- 收到请求:服务器收到浏览器发送的请求信息,返回响应。
- 页面渲染:浏览器收到服务器发送的响应,显示页面内容。
HTTP1.0、1.1、2.0、3.0之间的区别
- HTTP1.0:无连接,队头阻塞,缓存
- HTTP1.1:长连接,管道传输(解决了请求的队头阻塞,但是没有解决响应的队头阻塞)
- HTTP2.0:头部压缩,二进制格式,多路复用(彻底解决队头阻塞问题),服务端推送
- HTTP3.0:在Http2.0中始终在使用的时TCP协议,无论如何都还是会有TCP传输层的对头阻塞问题(只有TCP拿到完整连续的数据时,内核才会将数据从缓冲区交给HTTP应用,而只要前一个字节没有收到,HTTP就无法从内核缓冲区中得到数据,直到其到达,所以在此过程仍然会导致队头阻塞),而Http3.0是基于UDP协议的。因为UDP是不可靠传输,所以这就需要QUIC实现可靠机制
QUIC 也是需要三次握手来建立连接的,主要目的是为了确定连接 ID。
HTTP与HTTPS之间的区别
- HTTP协议是免费使用的,而 HTTPS 协议需要到CA机构申请证书,需要缴纳费用,HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL/TLS加密传输协议,信息是密文。
- HTTP的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议。
- 使用的端口不一样,HTTP是80,HTTPS是443。
HTTPS链接建立的过
① 证书验证阶段:
1)浏览器发起 HTTPS 请求;
2)服务端返回 HTTPS 证书;
3)客户端验证证书是否合法,如果不合法则提示告警。
② 数据传输阶段:
1)当证书验证合法后,在本地生成随机数(生成一个对称加密的秘钥);
2)通过公钥加密随机数,并把加密后的随机数传输到服务端;
3)服务端通过私钥对随机数进行解密;
4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。
对称加密与非对称加密
对称密钥加密,又称私钥加密,即信息的发送方和接收方用同一个密钥去加密和解密数据。
常见的对称加密算法:DES,AES等。
非对称密钥加密,又称公钥加密,信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。
最常用的非对称加密算法:RSA
Post和get区别
- 请求参数:GET 把参数包含在 URL 中,用&连接起来;POST 通过 request body 传递参数。
- 请求缓存:GET请求会被主动Cache,而POST请求不会,除非手动设置。
- 历史记录:GET请求参数会被完整保留在浏览历史记录里,而POST中的参数不会被保留。
- 编码方式:GET请求只能进行url编码,而POST支持多种编码方式。
- 参数数据类型:GET只接受ASCII字符,而POST没有限制数据类型。
- 数据包: GET产生一个TCP数据包;POST可能产生两个TCP数据包。
HTTP常见响应状态码
状态码 | 类别 |
---|---|
1XX | 信息性状态码 |
2XX | 成功状态码 |
3XX | 重定向状态码 |
4XX | 客户端错误状态码 |
5XX | 服务端错误状态码 |
200 OK:请求成功
301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL。
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL。
304 Not Modified:告诉客户端请求资源成功,但是这个资源不是由服务器提供返回给客户端的,而是客户端本地浏览器缓存中就有的这个资源。
400 Bad Request:表示请求报文存在语法错误。
403 Forbidden:服务器拒绝该次访问(访问权限问题)。
404 Not Found:表示服务器上无法找到请求的资源(也可以在服务器拒绝请求但不想给拒绝原因时使用)。
500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时。
502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应
503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求。
504 Gateway Time-out(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求文章来源:https://www.toymoban.com/news/detail-426711.html
重定向和转发区别
转发:请求一次,服务器内部请求
重定向:浏览器地址变化文章来源地址https://www.toymoban.com/news/detail-426711.html
cookie和session区别
- cookie:客户端。
- session:服务器。通过cookie实现,将sessionid放到Cookie中
到了这里,关于计算机网络面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!