| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络面试突破 -> 正文阅读 |
|
[网络协议]计算机网络面试突破 |
TCP和UDP的区别(传输层协议)定义:TCP作为面向流的协议,提供可靠的、面向连接的运输服务,并且提供点对点通信,UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播。 为什么TCP可靠?TCP在传输数据前会通过三次握手建立连接,在数据传输结束后会通过四次挥手关闭连接。除此之外还有滑动窗口和拥塞控制算法。它还有保留超时重传的机制。对于每份报文也存在校验,保证每份报文的可靠性。 为什么UDP不可靠?UDP是面向数据报无连接的,数据报发出去,就不保留数据备份了。仅仅在IP数据报头部加入校验和复用。UDP没有服务器和客户端的概念。UDP报文过长的话是交给IP切成小段,如果某段报废了,则全部报文就废了。 区别:①、TCP是基于连接的协议,UDP是基于无连接的协议;②、TCP要求的系统资源多,UDP要求的系统资源少;③、UDP程序结构较简单;④、TCP是流模式,UDP是数据报模式;⑤、TCP保证数据的正确性,UDP可能丢包;⑥、TCP保证数据顺序,UDP不保证。 TCP和UDP哪个协议有包长限制? UDP协议发送时,使用sendto函数最大能发送数据的长度为65535 - IP头(20)- UDP头(8)= 65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。TCP协议发送时,TCP时数据流协议,不存在包大小的限制。 打开网页是用TCP还是UDP? 用的是TCP协议,网页必须传输大量数据,并且TCP协议提供传输控制,按顺序组织数据并纠正错误。 DNS使用TCP还是UDP? DNS区域传输的时候使用TCP协议,域名解析时使用UDP协议。 开视频使用的是TCP还是UDP? 如果是用TCP,在面试时,网络有延迟会导致面试效率低;如果使用UDP,如果面试官问你问题时,你回答的答案丢失了,效率也低。所以采用TCP和UDP的结合,视频主要注重实时性,应偏向UDP+可靠机制。 细谈TCP的各种机制三次握手:①、第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号 seq=x,并将该数据包发送给客户端,进入syn_sent状态,等待服务端确认。②、第二次握手:服务端收到数据包由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值 seq=有,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。③、第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务器进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输数据了。 ?为什么TCP握手需要三次,两次行不行? 不行。TCP进行可靠传输的关键就是在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值。如果只是两次握手,至多只有客户端的起始序列号能被确认,服务器端的序列号则得不到确认。 什么是半连接队列?什么是SYN攻击? TCP握手中,当服务器处于SYN_RCVD状态,服务器会把此种状态下请求连接放在一个队列里,该队列称为半连接队列。SYN攻击即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,消耗CPU和内存资源。优化方式:①、缩短SYN的Timeout时间;②、记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。 什么情况下会出现TCP连接两端一个突然断开连接,另外一端如何感知? 客户主机掉线(网线断开)、电源断电、系统崩溃。Socket选项字段SO_KEEPALIVE用于标识是否设置保活功能,可以使用getsocketopt获取socket的选项信息,用setsocketopt函数设置socket的选项信息,如果socket被设置了SO_KEEPALIVE,那么如果2小时内该socket没有传输任何数据时,TCP就会自动给对端发送一个保活探测分节,该分节对方必须响应。保活定时器一般配置的时间是2小时,如果收到反馈则2小时后再发送,如果没有收到75秒再发送,连续10次没收到,TCP就会向上层应用程序发送“连接超时”的反馈错误。 四次挥手:①、第一次挥手:客户端数据发送完毕,客户端发送一个FIN包,用来关闭客户端到服务端的数据传输,客户端进入fin_wait_1状态。②、第二次挥手:服务端收到FIN包后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进去Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端发送数据,客户端仍要接受。③、第三次挥手:服务端数据发送完毕,服务端发送一个FIN包,用来关闭服务器端到客户端的数据传输,服务端进入Last_ack状态。④、第四次挥手:客户端收到FIN后,客户端进入TIME_wait状态,接着发送一个ACK给服务器,确认后,服务器进入Closed状态,完成四次挥手。 ? 为什么TCP挥手需要4次? 主要原因是当服务端收到客户端的FIN数据包后,服务端可能还有数据没发完,不会立即close。所以服务端会将ACK发送过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将FIN包发送给客户端表示现在可以断开连接了。客户端收到FIN包后发送ACK确认断开信息给服务器。 为什么四次挥手释放连接时,首释放端要进入TIME_WAIT状态,时间为多少,为什么? 因为首释放端最后收到FIN包,发出ACK包时,我们不能确保ACK包能够不丢失的传到对端,如果丢失对端将一直等待ACK包,对端发送未接受到ACK包的信息,首释放端接收不到。所以我们需要进入TIME_WAIT进行等待,时间为2MSL,MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经再网络中消失,不会出现与新TCP连接报文冲突的情况。 滑动窗口:滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发送自己的窗口大小,从而控制发送方的发送速度,防止发送方发送速度过快而导致自己被淹没。 拥塞控制:拥塞是指一个或者多个交换点的数据包超载,TCP又会有重传机制,导致过载。为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态遍历。当cwnd<ssthresh是,使用慢开始算法。当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。当cwnd=ssthresh时,即可使用慢开始算法,也可使用拥塞避免算法。 慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。 拥塞避免:cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。 快恢复:发送方判断网络出现拥塞(超时),就把ssthresh设置为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免。如果发送发判断网络可能出现拥塞(三个冗余ACK),就把ssthresh设置为出现拥塞时发送方窗口值的一半,cwnd设置为ssthresh,进行拥塞避免。 快重传:如果再超时重传定时器溢出之前,接受到连续的三个重复冗余ACK,发送端便知晓哪个报文段再传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。 TCP粘包现象?如何解决? TCP时面向流协议,发送的单位是字节流,因此会将多个小尺寸数据被封装在一个TCP报文中发出去的可能性。可以简单的理解成客户端调用了两次send,服务端一个recv就把信息都读出来了。处理方法:固定发送信息长度,或在两个信息之间加入分隔符。 细谈输入网址具体发生了什么?1、在浏览器种输入一个网址。 2、首先先将DNS进行解析,①客户机发送查询请求,在本地计算机缓存中查找,若没有找到,就会将请求发送给DNS服务器;②本地DNS服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里面查找;③本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名DNS服务器;④根域名服务器解析客户机请求的根域部分,它把包含的下一级的DNS服务器的地址返回到客户机的DNS服务器地址;⑤客户机的DNS服务器根据返回的信息接着访问下一级的DNS服务器;⑥这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息;⑦客户机的本地的DNS服务器会将查询结果返回给我们的客户机;⑧将DNS与对应的IP存入本地计算机缓存中,以便下次访问。成功将域名解析称IP地址,域名只是与IP地址的一个映射。(如果输入的时IP地址,此步骤省略) 3、根据解析得到的IP地址加端口,浏览器发起HTTP请求 4、浏览器建立一条与服务器的TCP连接(建立过程:三次握手) 5、浏览器通过TCP的三次握手建立好连接后,便再次向服务器发送HTTP请求,请求数据包 6、服务器收到并处理HTTP请求,根据请求信息去查找资源,返回响应信息 7、浏览器接受HTTP响应 8、如果报文中的状态码表示请求成功,则接受返回的资源 9、至此浏览器已经拿到了一个HTML文档,并为了呈现文档而开始解析 10、页面全部渲染结束 11、四次挥手关闭TCP连接 HTTP的状态码和对应的信息1XX:接受的信息正在处理 2XX:请求正常处理完毕 3XX:重定向 4XX:客户端错误 5XX:服务端错误 常见错误码:301:永久重定向;302:临时重定向;304:资源没修改,用之前缓存;400:客户端请求的报文有错误;403:服务器禁止访问资源;404:请求的资源在服务器上不存在或未找到 其中内容都是针对问题收集在网上收集,如果侵权告知立即删除! |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:32:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |