网络

## 网络问题 ### tcp网络协议理解 > 广义上讲是一个网络传输协议 > > 实际我们需要回答的是三次握手四次挥手 > [三次握手,四次挥手连接](https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc) **三次握手 ** TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。 ![三次握手](https://sfy01.oss-cn-beijing.aliyuncs.com/%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.jpg) - 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。 - 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。 - 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。 --- **四次挥手** - 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。 - 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。 下面来看看四次挥手的流程图: ![四次挥手](https://sfy01.oss-cn-beijing.aliyuncs.com/%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B.jpeg) - 中断连接端可以是客户端,也可以是服务器端。 - 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。 - 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。 - 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。 - 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。 --- ### tcp为什么是三次握手,4次挥手,为什么不是两次握手和3次挥手?少一次的话分别会出现什么问题? > 为了确保数据准确送达 三次握手: ​ 如果两次,那么服务端无法确定服务端的信息客户端是否能收到,所以如果服务端先说话,可能后面的客户端都收不到,会出现问题 。 ​ 如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证客户端可以给服务端发信息,客户端可以收到服务端的信息; 服务端可以给客户端发信息,服务端可以收到客户端的信息。 四次挥手: ​ 如果三次,那么服务端不能知道客户端是否收到了服务端的断开连接请求 --- ### TCP 如何保证可靠性,解释一下滑动窗口 > (先随便百度一下,回头详细补充) [TCP协议可靠性是如何保证之滑动窗口,超时重发,序列号确认应答信号](https://blog.csdn.net/a519640026/article/details/104486044/) --- ### tcp拥塞控制 > (先随便百度一下,回头详细补充) [TCP的拥塞控制(详解)](https://blog.csdn.net/qq_41431406/article/details/97926927) --- ### tcp与udp的区别 > (先随便百度一下,回头详细补充) [tcp与udp的区别](https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html) --- ### socket建立过程 > (先随便百度一下,回头详细补充) [Socket过程详细解释](https://blog.csdn.net/u013782203/article/details/51767763) --- ### 如何高效处理socket > (先随便百度一下,回头详细补充) [如何高效处理socket](https://www.cnblogs.com/Leo_wl/p/3267289.html) --- ### http和https的区别 1. HTTP的概述 HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTPP有多个版本,目前广泛使用的是HTTP/1.1版本。 2. HTTPS的概述 HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。 **浏览器在使用HTTPS传输数据的流程是什么?** ![https流程](https://sfy01.oss-cn-beijing.aliyuncs.com/https%E7%9A%84%E6%B5%81%E7%A8%8B.jpg) 1. 首先客户端通过URL访问服务器建立SSL连接。 2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。 3. 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 5. 服务器利用自己的私钥解密出会话密钥。 6. 服务器利用会话密钥加密与客户端之间的通信。 HTTP和HTTPS的区别 - HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。 - http和https使用连接方式不同,默认端口也不一样,http是80,https是443。 - HTTPS协议多次握手,导致页面的加载时间延长近50%; - HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗; - 申请SSL证书需要钱,功能越强大的证书费用越高。 - SSL涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。 --- ### https的建立链接过程 2. HTTPS的概述 HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。 **浏览器在使用HTTPS传输数据的流程是什么?** ![https流程](https://sfy01.oss-cn-beijing.aliyuncs.com/https%E7%9A%84%E6%B5%81%E7%A8%8B.jpg) 1. 首先客户端通过URL访问服务器建立SSL连接。 2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。 3. 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 5. 服务器利用自己的私钥解密出会话密钥。 6. 服务器利用会话密钥加密与客户端之间的通信。 --- ### RPC服务的底层架构,rpc框架原理,线程管理 > (先随便百度一下,回头详细补充) [RPC服务的底层架构](https://www.cnblogs.com/ExMan/p/10548710.html) [RPC框架原理与实现](https://www.cnblogs.com/xiaoqi/p/java-rpc.html) [RPC线程管理](https://www.cnblogs.com/ASPNET2008/p/7106820.html) --- ### 进程通信方法 > (先随便百度一下,回头详细补充) [进程通信方法](https://www.cnblogs.com/zgq0/p/8780893.html) --- ### NIO的原理和,连接切换方式 > (先随便百度一下,回头详细补充) [NIO的原理](https://blog.csdn.net/charjay_lin/article/details/81810922) [连接切换方式](https://blog.csdn.net/qq_35688140/article/details/105418075) --- ### poll,epoll和select的区别 > (先随便百度一下,回头详细补充) [IO多路复用select/poll/epoll介绍](https://www.bilibili.com/video/BV1qJ411w7du?from=search&seid=6529687577968988370) --- ### RPC调用原理 > (先随便百度一下,回头详细补充) [浅析RPC远程过程调用基本原理](https://blog.csdn.net/liucan9035/article/details/73662426) --- ### 网络协议细节 > (先随便百度一下,回头详细补充) [网络协议](http://www.360doc.com/content/19/0519/22/49586_836810860.shtml) --- ### 描述一个浏览器从请求发起到服务端接收到请求的过程(基于tcp/ip模型) > (先随便百度一下,回头详细补充) [描述一个浏览器从请求发起到服务端接收到请求的过程](https://www.cnblogs.com/yl179578605/p/10643018.html) 1. **TCP/IP 的具体含义** 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。 2. **数据包(包、帧、数据包、段、消息)** 以上五个术语都用来表述数据的单位,大致区分如下: - 包可以说是全能性术语; - 帧用于表示数据链路层中包的单位; - 数据包是 IP 和 UDP 等网络层以上的分层中包的单位; - 段则表示 TCP 数据流中的信息; - 消息是指应用协议中数据的单位。 3. **数据处理流程** 下图以用户 a 向用户 b 发送邮件为例子: ![数据处理流程](https://sfy01.oss-cn-beijing.aliyuncs.com/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B.jpg) ① 应用程序处理 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能; 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。 ② TCP 模块的处理 TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。 ③ IP 模块的处理 IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。 ④ 网络接口(以太网驱动)的处理 从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。 ⑤ 网络接口(以太网驱动)的处理 主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。 ⑥ IP 模块的处理 IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。 另外吗,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。 ⑦ TCP 模块的处理 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。***检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。 ⑧ 应用程序的处理 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。 ## NIO,Netty ![image.png](1)