前言 无论是 C/S 开发还是 B/S 开发,无论是前端开发还是后台开发,网络总是无法避免的,数据如何传输,如何保证正确性和可靠性,如何提高传输效率,如何解决会话管理问题,如何在网络拥堵环境下采取措施。这些都是需要了解的。 上一篇总结了 J
前言
无论是 C/S 开发还是 B/S 开发,无论是前端开发还是后台开发,网络总是无法避免的,数据如何传输,如何保证正确性和可靠性,如何提高传输效率,如何解决会话管理问题,如何在网络拥堵环境下采取措施。这些都是需要了解的。
上一篇总结了 Java 相关知识:夯实基础系列一:Java 基础总结。今天总结下与网络相关的知识,不是那么详细,但是包含了我认为重要的所有点。如果想深入了解的可以参考《图解HTTP[上野 宣]》、《图解TCP/IP(第5版)[竹下隆史]》以及计算机网络相关教材。
概要
网络知识我做了 8 个方面的总结,包括 DNS 协议,HTTP 协议,HTTPS 协议,TCP 协议,IP 协议,TCP/IP,Web 攻击,其他协议。以下对这些内容做一些简单的总结,同时我也有完整的思维导图,若有需要,请关注微信公众号蜗牛互联网,后台回复 网络 即可获取。
细节
1. DNS 协议
作用:提供域名到 IP 地址之间的解析服务。或逆向从 IP 地址反查域名的服务。
2. HTTP 协议
2.1 特点
- 无状态
- 使用 URI 定义互联网资源
- HTTP方法
- GET:获取资源
- POST:传输实体主体
- PUT:传输文件
- HEAD:获得报文首部
- DELETE:删除文件
- OPTIONS:询问支持的方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理
- 持久连接节省通信量
- 管线化实现并行发送多个请求,而不需要一个接一个等响应
- 用于 HTTP 协议交互的信息称为 HTTP 报文
- 请求报文
- 报文首部
- 请求行
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其他
- 空行
- 报文主体
- 响应报文
- 报文首部
- 状态行
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其他
- 空行
- 报文主体
- 发送多种数据的多部分对象集合
- MIME
- multipart/form-data
- 内容协商
- 服务器驱动协商
- 客户端驱动协商
- 透明协商
- 1XX:接收的请求正在处理
- 2XX:请求正常处理完毕
- 200 OK
- 204 NoContent
- 206 Partial Content
- 3XX:需要进行附加操作以完成请求
- 301 Moved Permanenetly
- 302 Found
- 303 See Other
- 304 Not Modified
- 307 Temporary Redirect
- 4XX:服务器无法处理请求
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 5XX:服务器处理请求出错
- 500 Internal Server Error
- 503 Service Unavailable
- 可扩展性:定义Via头域,增加版本号的支持
- 缓存
- 增加对缓存的重激活机制:使用 ETag 头域描述一个资源
- 增加 Cache-Control 头域支持可扩展的指令集
- 带宽优化:允许请求资源的某部分,而不是整个资源
- 长连接
- HTTP/1.0 只支持浏览器与服务器保持短暂的连接,浏览器的每次请求都要建立一个新的连接。
- 而 HTTP/1.1 允许在一个 TCP 连接上可以传送多个 HTTP 请求和响应。HTTP/1.1 协议的持续连接有两种方式,即非流水线方式和流水线方式。
- 非流水线方式的特点是,客户在收到前一个响应后才能发出下一个请求;
- 流水线方式的特点是,客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文
- 存取方式的不同
- Cookie 中只能保管 ASCII 字符串,假如需求存取 Unicode 字符或者二进制数据,需要先进行编码。Cookie 中也不能直接存取 Java 对象。若要存储略微复杂的信息,运用 Cookie 是比较艰难的。
- Session 中能够存取任何类型的数据,包括而不限于 String、Integer、List、Map 等。Session 中也能够直接保管 Java Bean 乃至任何 Java 类,对象等,运用起来十分便当。能够把 Session 看做是一个 Java 容器类。
- 隐私策略的不同
- Cookie 存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正 Cookie 中的内容。
- Session 存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
- 有效期上的不同
- Cookie 的过期时间指定
- Session 依赖于名为 JSESSIONID 的Cookie,而 Cookie JSESSIONID 的过期时间默许为 –1,只需关闭了浏览器该 Session 就会失效,因而 Session 不能完成信息永世有效的效果。
- 服务器压力的不同
- Cookie 保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie 是很好的选择。关于 Google、Baidu、Sina 来说,Cookie 或许是唯一的选择。
- Session 是保管在服务器端的,每个用户都会产生一个 Session。假如并发访问的用户十分多,会产生十分多的 Session,耗费大量的内存。因而像 Google、Baidu、Sina 这样并发访问量极高的网站,是不太可能运用 Session 来追踪客户会话的。
- 浏览器支持的不同
- Cookie 是需要客户端浏览器支持的。
- 假如客户端浏览器不支持 Cookie,需要运用 Session 以及 URL 地址重写。
- 跨域支持上的不同
- Cookie 支持跨域名访问,例如将 domain 属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该 Cookie。跨域名 Cookie 如今被普遍用在网络中,例如 Google、Baidu、Sina 等。
- Session 则不会支持跨域名访问。Session 仅在他所在的域名内有效。
- 用到的协议:DNS、HTTP、OSPF、IP、ARP
- 过程描述
- DNS 把域名解析成对应的 IP
- 发送一次请求,服务器返回一个永久重定向响应,这样浏览器就知道要访问的正确网址
- 发送请求 html 的请求,这个连接过程基于 TCP/IP 三次握手四次挥手的,建立连接
- 服务器返回一个 html 响应
- 浏览器根据渲染引擎解析返回的 html 响应,呈现内容
- 继续发送内嵌在html文件其他资源的请求,比如 css、js、图片资源等
- 加载整个页面
- 同网段
- 主机 A 要去 Ping 主机 B, 主机 A 会封装两层报文,主机 A 先检查自己 MAC 地址中是否有 B 的 MAC 地址,如果没有就向外发送一个 ARP 广播包
- 交换机收到这个 ARP 后,会检查在交换机中是否包含 B 的 MAC 地址,如果有就直接返回给 A;如果没有就向所有端口发送 ARP,该网段的主机的 MAC 如果与 B 的 MAC 地址不同就丢弃,如果主机 B 收到了该 ARP 就马上返回相同格式的 ARP
- 这时主机 A 已经有了 B 的 MAC 地址,就把 B 的 MAC 地址封装到 ICMP 报中,向主机 B 发送一个回显请求
- 主机 B 收到该报文后,知道是主机 A 的一个回显请求,就会返回一个相同格式的报文。这样就完成了同一个网段的 Ping 的过程
- 不同网段
- 主机 A 要去 Ping 一个不同网段的主机 C,主机 A 会去找网关转发
- 如果主机 A 不知道网关的 MAC 地址,就会发送一个 ARP 广播一下,这样就知道了网关的 MAC 地址
- 网关收到主机 A 的 ICMP 报文,根据上面的目的 IP,会去查找路由表,找到一个出口指针,给主机 C 发送一个 ICMP 报文
- 如果网关不知道主机 C 的 MAC 地址,就会给网关内所有的主机发送一个 ARP,从而找到主机 C 的 MAC 地址
- 主机 C 收到主机 A 的报文就会给主机 A 发送一个回显请求。这样就完成了不同网段的 Ping 的请求
- basic 认证
- digest 认证
- ssl 客户端认证
- 基于表单认证
- 认证多半为基于表单认证
- session 管理及 cookie 应用
- 全双工通信
- 特点
- 推送功能:支持服务器向客户端推送数据的推送功能
- 减少通信量:一直保持连接
- HTTP 连接建立后,需要完成一次握手动作
- 握手—请求:用到 HTTP 的 upgrade 字段告知服务器通信协议发生变化
- 握手—响应:对于之前的请求返回状态码 101 switching protocols
- 成功握手确立 WebSocket 连接之后,通信不再使用 HTTP 的数据帧,而采用 WebSocket 独立的数据帧
- 通信使用明文可能会被窃听
- 解决方式
- 通信加密。SSL 和 TLS 组合使用
- 内容加密
- 不验证通信方身份就可能遭遇伪装
- 解决方式:查明对手的证书
- 无法证明报文完整性,可能已遭篡改
- 数字签名,MD5 并不可靠,应用 HTTPS
- 慢
- 通信慢
- 由于大量消耗 CPU 及内存等资源,导致处理速度变慢
- SSL 必须进行加密处理
- 提供可靠的字节流服务
- 发送端发带 SYN 标志的数据包给对方。
- 接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。
- 最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束
- 客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送。
- 服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号。
- 服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A。
- 客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1。
- TCP 接收端对发送端发送多少字节的数据进行控制,防止接收端处理不及而丢失数据
- 发送窗口的大小是受到接收窗口的控制的。
- 发送窗口必须根据接收端的大小及时调整发送窗口的大小,这个机制保证了每次 TCP 传输的数据量都是接收端可以及时处理的。
- 保证接收端接收的数据是完整未受损伤的,是可靠性的重要保证。
- 主要使用校验和、确认、超时重传这三个工具进行差错控制。
- 拥塞窗口
- 发送方的窗口大小是接收窗口与拥塞窗口中的较小值。
- 拥塞窗口的大小又取决于网络的拥塞状况。
- 拥塞策略
- 慢开始
- 拥塞避免
- 拥塞检测
- 拥塞控制流程
- 由于刚开始不清楚网络的拥塞情况,所以会首先采用慢开始算法,开始阶段,窗口大小由1指数增大,直到窗口大小到达门限值。
- 窗口大小到达门限值后,就开始执行拥塞避免算法,之后窗口值按照线性规律增大,直到出现超时或者到达最大的窗口大小值。
- 这个时候,会开始执行拥塞检测算法,也就是把门限值变为窗口大小的一半,之后继续执行拥塞避免算法,窗口大小按照线性规律增大。
- 把数据包传送给对方
- IP 地址和 MAC 地址
- IP、ICMP、DNS、TCP、FTP、HTTP、SNMP
- 应用层
- 决定向用户提供应用服务时通信的活动。FTP、HTTP、DNS
- 传输层
- 对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。TCP、UDP
- 网络层
- 处理网络上流动的数据包
- 规定了通过怎样的路径到达对方计算机,并把数据包传送给对方
- 数据链路层
- 处理连接网络的硬件部分
- 发送端层与层之间传输数据,每经过一层时必定会被打上一个该层所属的首部信息
- 接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
- 这种把数据信息包装起来的做法称为封装
- 跨站脚本攻击 XSS
- SQL 注入攻击
- OS 命令注入攻击
- HTTP 首部注入攻击
- 邮件首部注入攻击
- 目录遍历攻击
- 远程文件包含漏洞
- 强制浏览
- 不正确的错误消息处理
- 开放重定向
- 会话劫持
- 会话固定攻击
- 跨站点请求伪造(CSRF)
- 密码破解
- 点击劫持
- dos 攻击
- 后门程序
- 组管理协议,它帮助多播路由器创建以及更新与每一个路由接口相连的忠实成员列表(就是与该路由接口连接频率较高)。
- 差错控制协议,弥补了 IP 协议没有差错纠正机制以及差错报告的缺憾。
- 地址映射协议,可以把一个 IP 地址映射为 MAC 地址。
2.2 HTTP 报文
2.3 HTTP 状态码
2.4 HTTP 1.1 和 HTTP 1.0的区别
2.5 Cookie 与 Session 的区别
2.6 电脑访问网页的过程
2.7 Ping
2.8 路由器与交换机的区别
路由器包含了交换机的功能,交换机主要的作用是扩展接口
2.9 确认访问用户身份的认证
2.10 websocket
3. HTTPS 协议
3.1 HTTP 缺点
3.2 HTTP+加密+认证+完整性保护=HTTPS
3.3 HTTPS 是身披 SSL 外壳的 HTTP
3.4 HTTP 采用混合加密机制
3.5 证明公开密钥正确性的证书
3.6 SSL 协议
4. TCP 协议
4.1 传输层
4.2 作用
4.3 大块数据分割成报文段(segment)
4.4 三次握手
握手某个阶段中断,TCP 会以相同的顺序发送相同的数据包
4.5 四次挥手
4.6 流量控制
4.7 差错控制
4.8 拥塞控制
5. IP协议
5.1 网络层
5.2 作用
5.3 条件
5.4 使用 ARP 协议凭借 MAC 地址进行通信
5.5 路由选择
6. TCP/IP
6.1 协议族
6.2 分层管理
6.3 通信传输流
7. Web 攻击
7.1 因输出值转移不完全引发的安全漏洞
7.2 因设置或设计上的缺陷引发的安全漏洞
7.3 因会话管理疏忽引发的安全漏洞
7.4 其他安全漏洞
8. 其他协议
8.1 IGMP 协议
8.2 ICMP 协议
8.3 ARP协议
动手验证
# 把一次请求拆开:DNS / 建连 / TLS / 首字节 / 总计
curl -o /dev/null -s -w "dns=%{time_namelookup} connect=%{time_connect} app=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}" https://example.com
# 解析链路走到哪一层出错
dig +trace example.com | tail -20
# SYN 有没有重传(重传 = 链路或防火墙在丢包)
sudo tcpdump -i any -nn 'tcp port 443 and tcp[tcpflags] & tcp-syn != 0' -c 20
延伸阅读:官方与权威资料
相关阅读(站内)
常见问题
Q:G1 GC 和 CMS 垃圾回收器有什么区别?
G1 把堆拆成多个 Region,用标记-整理避免内存碎片,目标是可预测的停顿时间;CMS 用标记-清除,回收快但会产生碎片。JDK 9 起 G1 成为默认收集器,JDK 14 移除 CMS。
Q:G1 的 Remembered Set 是干什么的?
Region 化之后跨 Region 的引用都要记账,Remembered Set 记录其他 Region 指向本 Region 的指针,回收某个 Region 时不用扫全堆,这是 G1 停顿可控的关键之一。
Q:怎么调优 G1 的停顿时间?
三步走:先把 -XX:MaxGCPauseMillis 设在合理区间(别贪低,太小会疯狂扩容堆)、再看 GC 日志里的 Mixed GC 频率定位大对象、用 -XX:InitiatingHeapOccupancyPercent 控制并发标记起手时机。
Q:为什么 Java 的 String 要设计成不可变?
不可变才能安全共享与缓存哈希值,也能安全地放进字符串常量池;一旦可变,其他线程持有引用时修改会破坏哈希表与缓存的一致性。
Q:Java 里 == 和 equals 的区别是什么?
== 比较引用地址,equals 比较对象内容。String、Integer 等包装类重写了 equals,自定义对象不重写 equals 时,equals 等价于 ==。
本文首发于 java4u.cn,转载请注明出处。
关注「蜗牛聊AI」,一起看懂技术变化背后的真正机会。

