前言
这里主要记录的是自己关于网络方面的学习总结,参考了javaguide、cs-notes和图解http的内容
一、OSI七层模型
网络相关的内容首先就是关于OSI七层模型
主要包括:
- 应用层 ——计算机应用服务
- 表示层 —— 数据处理
- 会话层 —— 管理应用程序之间的会话
- 传输层 —— 为进程通信提供通用数据服务
- 网络层 —— 路由和寻址
- 数据链路层 —— 管理相邻节点的数据通信
- 物理层 —— 利用传输介质为数据链路层提供数据支持
七层结构相对来讲是很清晰的,但实现起来相对复杂,周期过长,所以目前常用的模型是TCP/IP四层模型
二、TCP/IP四层模型
TCP/IP四层模型是目前应用最广泛的模型,主要包括:
- 应用层
- 传输层
- 网络层
- 网络接口层
应用层(Application Layer)
主要为两个终端的应用程序(进程)之间的信息交互提供服务,定义了信息交互的格式,并交给传输层进行下一步处理,而不用关心传输层具体操作
应用层常见协议:
- HTTP/HTTPS —— 最常见的超文本传输协议(80、443)
- DHCP —— 路由器分配ip地址(67、68)
- FTP —— 基于tcp的文件传输协议(20/数据连接、21/控制连接)
- SSH —— 为远程登录会话提供的安全协议(20、21)
- SMTP —— 邮件发送协议,发送ascii码(25)
- DNS —— 域名解析(53/udp或tcp,默认udp长度超过512字节时使用tcp)
传输层(Transport Layer)
负责为两个终端进程间通信提供通用的数据传输服务
通用是指不管是http还是smtp都是用tcp
- 是进程间的逻辑通信(看起来像是有一条端到端的逻辑通信信道)
udp
用户数据报协议
- 无连接
- 尽最大可能交付
- 没有拥塞控制
- 面向报文
对于用户应用层下发的报文不进行合并和拆分,只是添加udp首部
支持一对一、一对多、多对一、多对多的通信
udp首部格式
首部只有8个字节:
- 源端口
- 目的端口
- 长度
- 校验和
伪首部的12个字节是为了计算检验和临时加的
tcp
传输控制协议
- 面向连接
- 提供可靠交互
- 有流量控制
- 提供全双工通信
- 面向字节流(把应用层报文看作字节流,把字节流重新组织成大小不等的数据块)
- 点对点连接
tcp首部格式
主要包括:
- 序号 seq: 对字符流进行编号,表示第一个字节编号,如果编号为301,则表示第一个字符编号为301,若数据长度为100,下一个报文段序号为401
- 确认号: 希望收到的下一个报文段的序号。若B受到A序号为501,长度为200字节的报文段,则B返回给A的确认报文段中确认号为701,及B期望下一个报文段的序号为701
- 数据偏移: 数据部分距离报文起始位置的偏移量,实际上就是首部的长度
- 确认 ack: ack = 1时确认号有效,否则会忽略确认号。tcp建立连接之后传输的所有报文段ack必须置1
- 同步 syn: 建立连接时用来同步的序号。syn = 1, ack = 0 表示连接请求报文段,若服务器同意建立连接,则响应syn = 1, ack = 1
- 终止 fin: 用来释放一个连接,当fin = 1,表示报文段的发送方数据发送完毕,并要求释放连接
- 窗口: 接收方让发送方设置发送窗口的依据,因为接收方数据缓存空间有限
tcp三次握手
为了将数据准确无误的传输给接收方,tcp协议采用三次握手策略
具体握手步骤:
- 服务器端B处于LISTEN(监听)状态,等待客户端的连接请求
- 客户端A向B发送请求连接的报文,syn = 1,ack = 0,选择初始序号x
- B接收到连接请求报文,若同意连接,则向A发送请求确认报文,syn = 1,ack = 1,确认号seq = x + 1,同时选择一个初始序号y
- A收到B的连接确认报文后,还要向B发出确认,seq = y + 1,序号x + 1
- B收到A的确认后,连接建立
若握手过程中某个阶段莫名中断,TCP协议会再次以相同顺序发送相同数据包
为什么要三次握手
三次握手的目的是建立可靠通信,确认双方的发送和接收功能是否正常
- 第一次握手: client什么都不能确认;Server确认对方发送正常,自己接收正常
- 第二次握手:Client确认自己发送、接收正常,对方发送、接收正常;Server确认对方发送正常,自己接收正常
- 第三次握手:Client确认自己发送、接收正常,对方发送、接收正常;Server确认自己发送、接收正常,对方发送接收正常
共计3次握手,确认双方的发送接收都正常
第三次握手是为了什么
第三次握手是为了防止失效的连接请求到达服务器,导致服务器错误打开连接
如果客户端发送的请求在网络中滞留,就需