2-1 网络基础知识讲解
OSI 开放式互联参考模型
OSI 的“实现”:TCP/IP
网络七层 | TCP/IP概念层模型 | 数据格式 | 功能 | 包含协议 |
---|---|---|---|---|
应用层 | 应用层 | 数据 | 网络服务与使用者应用程序间的一个接口 | HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP |
表示层 | 数据表示、安全、压缩 | 没有协议 | ||
会话层 | 会话层连接到传输层的映射;会话连接的流量控制;数据传输;会话连接恢复与释放;会话连接管理、差错控制 | 没有协议 | ||
传输层 | 传输层 | 数据段 | 用一个寻址机制来标识一个特定的应用程序(端口号) | TCP、UDP |
网络层 | 网络层 | 数据包 | 基于网络层地址(IP地址)进行不同网络系统间的路径选择 | IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25 |
数据链路层 | 数据链路层 | 数据帧 | 在物理层上建立、撤销、标识逻辑链接和链路复用以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址 | 以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP |
物理层 | 物理层 | 比特流 | 建立、维护和取消物理链接 | 线路、无线电、光纤、信鸽 |
2-2 TCP的三次握手
传输控制协议 TCP 简介
- 面向连接的、可靠的、基于字节流的传输层通信协议。
- 将应用层的数据流分割成报文段并发送给目标节点的 TCP 层。
- 数据包都有序号,对方收到则发送 ACK 确认,未收到则重传 。
- 使用校验和来检验数据在传输过程中是否有误。
TCP 报文头
一般使用IP+协议+端口号(Socket套接字)标识网络中的一个进程
TCP Flags
- URG:紧急指针标志
- ACK:确认序号标志
- PSH:push 标志
- RST:重置连接标志
- SYN:同步序号,用于建立连接过程
- FIN:finish 标志,用于释放连接
握手是为了建立连接,TCP 三次握手的流程图如下:
- 第一次握手:建立连接时,客户端发送 SYN 包(syn=j)到服务器,并进入 SYN_SEND 等待状态,等待服务器确认;
- 第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
- 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
记录一次 TCP 三次握手过程
为什么需要三次握手才能建立起连接
- 为了初始化 Sequence Number 的初始值。
首次握手的隐患——SYN 超时
- 问题起因分析
- Server 收到 Client 的 SYN,回复 SYN-ACK 的时候未收到 ACK 确认。
- Server 不断重试直至超时,Linux 默认等待63(1+2+4+8+16+32)秒才断开连接。
- 针对SYN Flood 的防护措施
- SYN 队列满后,通过 tcp_syncookies 参数回发 SYN Cookie。
- 若为正常连接则 Client 会回发 SYN Cookie ,直接建立连接。
建立连接后,Client 出现故障怎么办
- 保活机制
- 向对方发送保活探测报文,如未收到响应则继续发送。
2-3 TCP 的四次挥手
挥手是为了终止连接,TCP 四次挥手的流程图如下:
- 第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态;
- 第二次挥手:Server 收到 FIN 后,发送给一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态
- 第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK状态;
- 第四次挥手:Client 收到 FIN 后,Client 进入TIME_WAIT状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入CLOSED状态,完成四次挥手。
记录一次TCP 四次挥手过程
为什么会有 TIME_WAIT 状态
- 确保有足够的时间让对方收到 ACK 包。
- 避免新旧连接混淆。
为什么需要四次握手才能断开连接
- 因为全双工,发送方和接收方都需要 FIN 报文和 ACK 报文。
服务器出现大量 COLSE_WAIT 状态的原因
- 对方关闭 socket 连接,我方忙于读或写,没有及时关闭连接
- 检查代码,特别是释放资源的代码。
- 检查配置,特别是处理请求的线程配置。
2-4 TCP 和 UDP 的区别
UDP 简介
- UDP 报文结构
- UDP 特点
- 面向非连接。
- 不维护连接状态,支持同时向多个客户端传输相同的消息。
- 数据包报头只有8个字节,额外开销小。
- 吞吐量只受限于数据生成速率、传输速率以及机器性能。
- 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表。
- 面向报文,不对应用程序提交的报文信息进行拆分或者合并。
TCP 和 UDP 的区别
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 无连接 |
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
连接对象个数 | 只能一对一通信 | 支持一对一、一对多、多对一和多对多交互通信 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
适用场景 | 适用于要求可靠性传输的应用,如文件传输 | 适用于实时应用(视频会议、视频直播等) |
2-5 TCP 的滑动窗口
RTT 和 RTO
- RTT:发送一个数据包到收到对应的 ACK,所花费的时间。
- RTO:重传时间间隔。
TCP 使用滑动窗口做流量控制与乱序重排
- 保证 TCP 的可靠性。
- 保证 TCP 的流控特性。
2-6 HTTP 相关
超文本传输协议 HTTP 主要特点
- 支持客户/服务器模式(C/S).
- 简单快速
- 灵活
- 无连接
- 无状态
HTTP 请求结构
HTTP 响应结构
请求/响应的步骤
- 客户端连接到 WEB 服务器
- 发送 HTTP 请求
- 服务器接受请求并返回 HTTP 响应
- 释放连接 TCP 连接
- 客户端浏览器解析 HTML 内容
在浏览器地址栏键入 URL,按下回车后经历的流程
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
HTTP 状态吗
- 1XX:指示信息——表示请求已接受,继续处理。
- 2XX:成功——表示请求已被成功接收、理解、接受。
- 200 OK:正常返回信息。
- 3XX:重定向——要完成请求必须进行更进一步的操作。
- 301 Moved Permanently:永久重定向。
- 302 Found:临时跳转。
- 4XX:客户端错误——请求有语法错误或请求无法实现。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在。
- 5XX:服务器端错误——服务器未能实现合法的请求。
- 500 Internal Server Error:服务器发生了不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
GET 请求和 POST 请求的区别
- HTTP 报文层面:GET 将请求放在 URL,POST 放在报文体中。
- 数据库层面:GET 符合幂等性和安全性,POST 不符合。
- 其他层面:GET 可以被缓存、被存储,而 POST 不行。
Cookie 和 Session 的区别
-
Cookie 简介
- 是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端。
- 客户端再次请求的时候,会吧 Cookie 回发。
- 服务器接受到后,回解析 Cookie生成与客户端相对应的内容。
-
Cookie 的设置以及发送过程
-
Session 简介
- 服务器端的机制,在服务器上保存信息。
- 解析客户端请求并操作session id,按需保存状态信息。
-
Session的实现方式
- 使用Cookie来实现。
- 使用URL回写来实现。
-
Cookie和Session的区别
- Cookie数据存放在客户的浏览器上,Session数据放在服务器上;
- Session相当于Cookie更安全;
- 若考虑减轻服务器负担可以考虑使用Cookie;
2-7 HTTP和HTTPS的区别
SSL(Security Sockets Layer,安全套接层)
- 为网络通信提供安全及数据完整性的一种安全协议;
- 是操作系统对外的API;
- 采用身份验证和数据加密保证网络通信提供安全及数据完整性;
HTTPS数据传输流程
- 浏览器将支持的加密算法信息发送给服务器;
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器;
- 浏览器验证证书的合法性,并结合证书公钥加密信息发送给服务器;
- 服务器使用私钥解密信息,验证哈希加密响应信息回发浏览器;
- 浏览器解密响应信息,并对消息进行验证,之后进行加密交互数据;
HTTP和HTTPS的区别
- HTTPS需要到CA申请证书,HTTP不需要;
- HTTPS密文传输,HTTP明文传输;
- 连接方式不同,HTTPS默认使用443端口,HTTP默认使用80端口;
- HTTPS = HTTP + 加密 + 认证 + 完整性保护,较HTTP安全;
HTTPS不一定安全
- 浏览器默认填充 http:// 请求需要跳转有被劫持的风险;
- 可以使用HSTS优化;
2-8 Socket 相关
Socket 是对 TCP/IP 协议的抽象,是操作系统对外开放的接口。