> For the complete documentation index, see [llms.txt](https://luckycurvec.gitbook.io/java-knowledge-architecture/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://luckycurvec.gitbook.io/java-knowledge-architecture/mian-shi-12/ji-suan-ji-wang-luo.md).

# 计算机网络

网络中的协议层次（从上到下，向上提供服务）：

* 应用层：如Web世界中应用最广泛的HTTP（超文本【对传统文本语义的扩充】传输【Client端与Server端的应答过程】协议【共同遵守的规范和约束】）、SMTP（电子邮件传输协议）、FTP（端系统文件上传协议）。主要是端上的应用程序与另一个端的应用程序之间的通信过程。传输的单位是**报文**。
* 传输层：实现的是端与端之间的通信，主要包含两种协议：TCP（面向数据流的、确保报文段的送达、可以通过拥塞控制来抑制传输速率）和UDP（面向报文段的、不确保消息的送达、因此不会控制）。之所以TCP是面向数据流的，UDP是面向报文段的，可以这样理解，因为TCP会一次发送发送窗口中的内容，如果发送窗口足够大，那么对应用程序来说他只是完成了数据的写入工作，类似于直接将数据写入到即将发送的数据流当中去，而UDP是每次都是直接发送报文段的，在应用程序看来就是一个个报文段的发送。传输单位是**报文段**。
* 网络层：主要涉及的就是网段与网段之间的通信，主要协议为IP协议（主要就是子网网段的划分）、ICMP协议（能否通信成功）、OSPF协议（最短路径优先），传输的基本单位是数据包
* 数据链路层：完成对底层比特流的封装，并且在发送过程中确保帧的正确性，传输的基本单位是帧。
* 物理层：完成对底层硬件的屏蔽，实现比特流的透明传输。

HTTPS是以安全为目标的HTTP通道，在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性，HTTPS = HTTP + SSL（TLS）

浏览器输入URL访问的全过程：

* hosts文件——DNS服务器找到IP地址
* 通过IP地址建立TCP连接，可能涉及到OSPF协议（不是一个网段的情况下）
* Client端通过套接字向服务端发送HTTP请求报文
* Server端通过套接字接收报文，并根据请求响应一个报文，通过套接字完成对客户端的响应工作
* 如果是HTTP1.0此时Server端立刻完成TCP的关闭，Client端TCP的关闭会延迟到取出报文段最后一个字节后也完成关闭
* Client端页面渲染

HTTP的格式：起始行【GET URL HTTP Version】、请求头/响应头、body

由于HTTP是明文传输且不会伪装，发送方和接收方都很容易被伪造，数据也容易被中途篡改。HTTPS较之于HTTP的优化点有：

1、加密，防止数据窃听

对称加密【AES-256】、非对称加密【RSA】（是可以相互加解密的，只不过习惯将私钥置于独有的位置，所以使用公钥完成数据加密）、混合加密【RSA慢，AES快，为了解决这个冲突，Client端和Server端持有自己的公钥和私钥，使用非对称加密来完成对会话密钥的加密，然后Server端和Client端使用对称加密来完成对需要传输的内容的加密】

RSA：取出两个大的素数pq，越大加密等级越高，但是加解密消耗也越大

2、数据一致性（完整性）：避免被中途篡改

摘要算法，常见的如MD5、SHA-256，将任意长的文件通过这种不可逆的算法得到一串固定长度的字符串，通过对字符串的校验来比较文件是否完整

3、身份认证：防止中间人攻击或者被模拟成发送端或者接收端

实现不需要引入其他的东西了，仅需通过私钥这种方式来完成，因为私钥是独有的，可以完成身份认证。通过将报文使用摘要算法生成一个密文，通过私钥加密将密文形成自己独有的数字签名即可，发送时候带上这个数字签名即可完成认证。

> 公私钥的来源是请求需要存储私钥的端要公钥

SSL/TLS

TLS是SSL的后续版本（2000年时候更名），思想就是非对称加密，创建密钥对，有公钥和私钥，私钥一般存储在服务器上，然后用户向服务器上发送数据的时候使用公钥来完成加密，最后服务端使用私钥来进行解密

TCP的粘包拆包

粘包：TCP发送时候将存储在发送窗口的多个数据包打包成一个TCP报文段发送出去，这样就导致了数据的粘包问题。

拆包：如果通信的一端一次发送的数据量超过了发送窗口的阈值，那么此时会拆分成多个TCP报文段来进行发送。

对于粘在一起的包需要拆开，对于拆开的包需要粘在一起来

在每个数据包的前面加上长度信息即可

TCP的特点（说说你对TCP的理解）：

传输层的主要协议之一、另一个是UDP，对着UDP来说就行

1、面向连接的 2、可靠的（编号校验、单个报文段校验、流量控制、拥塞控制） 3、传输效率较低 4、多出的12位是为了计算TCP校验和的

拥塞避免几个算法：慢开始（拥塞窗口++）、拥塞避免（拥塞窗口++，慢开始门限++）、快重传和快恢复（连续接收到三个重复确认，如连续发送12345报文段，此时1发送成功，2发送失败，发送3时候成功，收到1确认，发送4成功，收到1的确认，发送5成功，收到1的确认，此时会立即完成对报文段2的重传，不需要等待报文段2的时间到了）。发生网络拥塞情况，拥塞窗口=1，慢开始门限/2

HTTP Version迭代的东西：

HTTP1.1较之于HTTP1.0

优点：引入了TCP持久化连接的特性，实现多个请求完成TCP的复用，并且姓曾请求方式PUT和UPDATE

HTTP2.0较之于HTTP1.1

优点：支持TCP的全双工，可以完成客户端与服务端的数据包并行发送，增加了带宽的利用率。使用二进制传输方式代替字符串传输，增加传输效率。HTTP请求头大量重复信息，在传递下一个的时候仅仅只会记录HTTP请求头的变更信息

缺点：建立连接时候时间长 TCP1.5个RTT，TLS也要消耗1\~2个RTT
