计算机网络
5层协议
- 物理层:实现相邻计算机节点之间比特流的传送,京可能屏蔽传输介质和物理设备的差异。
- 数据链路层:将网络层交下来的 IP 数据报组装成帧传送。
- 网络层:将运输层的数据封装为数据报并选择合适的网间路由和交换节点,确保数据及时传送。
- 传输层:负责向两台主机进程之间的通信提供数据传输服务,主要使用 TCP 和 UDP 协议。
- 应用层:通过应用进程间的交互完成特定的网络应用。
TCP
传输控制协议(TCP)是一种面向连接的,可靠的,基于字节流的传输层通信协议。
三次握手
TCP 连接时使用三次握手协议建立连接:
三次握手的目的是建立可靠的通信信道,确认双方的发送与接收是否正常:
- 第一次握手:Server 确认对方发送正常,自己接收正常。
- 第二次握手:Client 确认自己发送、接收正常,Server 发送、接收正常。
- 第三次握手:Server 确认对方接收正常,自己发送正常。
这样,通过三次握手,双方就互相确认了接收、发送功能是否正常可用。
四次挥手
TCP 断开连接时使用四次挥手协议断开连接:
- 客户端发送一个 FIN 关闭客户端到服务端的数据传输。
- 服务器收到 FIN,返回 ACK (FIN 与 SYN 都消耗一个序号)
- 服务端端发送一个 FIN 关闭服务端到客户端的数据传输。
- 客户端发回 ACK 确认。
任何一方都可以在数据传输结束后发出释放连接的通知,这时 TCP 连接进入半关闭状态,另一方也发出释放连接的通知后才关闭 TCP 连接。
可靠传输
TCP 通过如下的方式提供可靠性:
- 应用数据被分割成 TCP 认为合适的数据块,并编号。
- 超时重传。如果不能及时收到一个报文段的确认,就重发这个报文段。
- 通过校验和检测数据在传输过程中的变化。
- 对收到的数据进行排序,确保数据有序。
- 丢弃重复数据。
- 流量控制,TCP 接收端只允许另一方发送缓冲区能接收的数据。
- 拥塞控制:慢开始,拥塞避免,快重传与快恢复(基于丢包的拥塞控制,高版本Linux内核已经不使用)。
UDP
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。UDP 不提供数据包分组、组装和不能对数据包进行排序,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP报头由4个域组成,其中每个域各占用2个字节,共8个字节,具体包括源端口号、目标端口号、数据报长度、校验值。
TCP 与 UDP 区别
类型 | 特点 | 性能 | 应用场景 | 首部字节 |
---|---|---|---|---|
TCP | 面向连接,可靠,以字节流传输 | 传输效率慢 | 要求通信可靠 | 20-60字节 |
UDP | 无需连接,不可靠,以报文段传输 | 传输效率高 | 要求通信快速 | 8字节 |
HTTP
HTTP 是一个简单的无状态应用层请求-响应协议,它通常运行在 TCP 之上。
请求与响应
HTTP 请求包含以下三个部分:
- 请求行:请求方式 url 版本 (例:POST /login HTTP/1.1)
- 请求头:key-value 格式 (例:Referer 表示请求从何处跳转,User-Agent 表示浏览器相关信息)
- 请求体:请求的参数。
HTTP 响应包含以下三个部分:
- 响应行:协议 状态码 信息 (例:HTTP/1.1 200 OK)
- 响应头:key-value 格式
- 响应体:响应的参数。
状态码
类型 | 名称 | 意义 |
---|---|---|
1xx | 信息状态码 | 接收的请求正在处理 |
2xx | 成功状态码 | 请求正常处理完毕 |
3xx | 重定向状态码 | 请求地址改变 |
4xx | 客户端错误状态码 | 客户端发送服务器无法处理的请求 |
5xx | 服务器错误状态码 | 服务器内部发生错误 |
HTTP 版本
HTTP/1.0 默认使用短链接。HTTP/1.1 默认使用长连接,在请求头加入 Connection:keep-alive
,网页打开后,TCP 连接不会关闭,再次访问服务器依旧使用已经建立的连接。
HTTPS
HTTPS 与 HTTP 的主要区别如下:
- HTTP 默认端口80,HTTPS 默认端口443
- HTTP 传输明文,HTTPS 传输内容经过对称加密,对称加密的密钥又通过服务器证书进行了非对称加密。
打开一个网页的过程
Cookie 与 Session 的区别
- Cookie 保存在浏览器,Session 保存在服务端。
- Cookie 只能保存字符串,Session 能保存任何类型的数据。
- Session 比较安全。