TCP/IP协议栈
1. OSI参考模型与TCP/IP协议栈
OSI(Open System Interconnection)参考模型是由ISO(International Organization for Standardization)国际标准化组织提出并订制的,但是在推出理论模型时,已经有了事实标准的TCP/IP协议栈。
OSI参考模型与TCP/IP协议栈对应关系如图所示。
2. TCP/IP协议栈
HTTP传输单位:消息或报文(message),TCP传输单位:段(segment),IP传输单位:包(packet),网络接口层传输单位:帧(frame)。
TiPs:TCP粘包了,说的其实是IP包
2.1 应用层
应用层不关心数据在网络中的传输,只专注提供应用功能。比如协议HTTP、FTP、Telnet、DNS、SMTP等。
应用层进程运行在用户态,传输层及以下都运行在内核态。
2.2 传输层
传输层给应用层提供网络支持,最常见的两个协议:TCP及UDP。提一下QUIC,是基于UDP实现的可靠性传输协议。
2.2.1 TCP
定义
Transmission Control Protocol,传输控制协议。
是一种面向连接的、可靠的、基于字节流的传输层通信协议。
它是一种面向连接的协议,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket)。
特点
- 面向连接
- 全双工通信
- 超时重传
- 流量控制
- 拥塞控制
- 基于字节流
MSS
TCP 段:当传输层的数据包大小超过 MSS(TCP 最大报文段长度,一般为1460字节) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。
2.2.2 UDP
定义
User Datagram Protocol,用户数据报协议。
UDP提供面向事务的简单而不可靠的信息传输服务。比如DNS协议。
特点
- 不保证数据包到达
- 实时性高
- 效率高
UDP比TCP效率更高的原因:
- UDP不需要建立连接:TCP协议在传输数据之前需要建立连接,而UDP不需要。这减少了建立连接的开销,提高了传输效率。
- UDP没有繁琐的握手过程:TCP协议为了保证数据的可靠性,需要进行繁琐的握手过程,包括三次握手等。而UDP没有这些过程,直接传输数据,减少了延迟。
- :TCP协议为了保证数据的可靠性,采用了复杂的拥塞控制算法和重传机制。这些机制虽然能够保证数据的可靠性,但也增加了延迟和开销。而UDP没有这些机制,因此能够更快地传输数据。
- UDP对网络环境的要求较低:TCP协议为了保证数据的可靠性,需要在稳定的网络环境下运行。而UDP对网络环境的要求较低,能够在不稳定的环境下运行,因此能够更好地适应网络环境的变化。
- UDP支持一对一、一对多、多对一和多对多的交互通信:TCP协议只能支持一对一的交互通信。而UDP支持多种方式的交互通信,这使得UDP在某些应用场景下更加灵活和高效。
- UDP的数据传输速率比TCP更快:由于UDP没有TCP的繁琐握手过程和重传机制,因此能够更快地传输数据。在一些应用场景下,如实时游戏等,UDP的传输速率比TCP更快,能够更好地满足实时性的要求。
2.3 网络层
主要协议是IP协议,是实际的传输功能承担者,而传输层并不实际负责传输。
2.3.1 作用
寻址和路由。
寻址作用是决定去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。
寻址更像在导航,路由更像在操作方向盘。
2.3.1.1 寻址
IP地址分为两部分:网络号和主机号。
需要配合子网掩码才能区分,将IP和子网掩码按位与运算得到的结果即可网络号。
2.3.1.2 路由
路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。
2.3.2 MTU
如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会进行分片,得到一个即将发送到网络的 IP 报文。
MTU:整个IP包的大小
MSS:除开20字节的TCP头部后,剩余的TCP段的负载大小
MTU和MSS的关系如下。
2.4 网络接口层
网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。
以太网由太网接口,Wi-Fi接口,以太网交换机、路由器上的千兆,万兆以太网口及网线等组成,是一种在「局域网」内,把附近的设备连接起来,使它们之间可以进行通讯的技术。
网络接口层在IP头部的前面加上MAC头部,并封装成数据帧(Data frame)发送到网络上。MAC 头部包含了接收方和发送方的 MAC 地址等信息,可以通过 ARP 协议获取对方的 MAC 地址。
ARP协议是地址解析协议,它根据IP地址获取物理地址。ARP协议的作用是将IP地址解析为MAC地址,以便在局域网内进行通信。
在发送信息时,如果目标IP地址和本机IP地址不同,主机就会将包含目标IP地址的ARP请求广播到局域网上的所有主机,并接收返回消息,以此确定目标的物理地址。收到返回消息后,将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP协议是建立在网络中各个主机互相信任的基础上的,局域网上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗.
2. Socket
Socket是介于应用层及传输层的一种通信方式。
Socket其实就是个四元组,<源IP、源Port、目的IP、目的Port>。
其中端口号有16位,故支持最多65535个端口可用。
Ipv4的源Ip只有32位,而Ipv6有128位。
3. 浏览器键入网址后协议栈流程
URL解析 -> 生成HTTP请求 -> DNS请求 -> Socket连接 -> TCP封装,加TCP头按照MSS分段 -> IP封装,加IP头按照MTU分包 -> MAC封装,加MAC帧头帧尾 -> 交换机(ARP协议) -> 路由器 -> 交换机 -> 解MAC帧,去掉MAC头 -> 解IP包,去掉IP头 -> 解TCP段,去掉TCP头 -> 解析HTTP数据 -> 服务器处理 -> 生成HTTP响应 -> ...(再走一遍协议栈)-> Socket连接关闭 -> 浏览器解析HTTP响应并渲染
TCP/IP协议栈的数据包结构:
3.1 URL解析
3.2 生成HTTP格式数据
浏览器会根据解析出来的URL请求,生成HTTP格式的请求数据。(如果是HTTP协议的话)
3.2.1 HTTP请求
- 请求行
方法 URL 版本 - 消息头
首部字段名 字段值 - 消息体
数据
3.2.2 HTTP响应
- 状态行
版本 状态码 短语 - 消息头
首部字段名 字段值 - 消息体
数据
3.3 DNS请求
浏览器若是有缓存便不会请求。一般是 浏览器缓存 -> 系统缓存 -> hosts文件 -> DNS请求。
DNS记录是一系列键值对,比如常见记录类型如下:
- A记录:地址记录,用于指定域名的IPv4地址。
- NS记录:域名服务器记录,用于指定保存下一级域名信息的服务器地址。
- MX记录:邮件交换记录,用于标明域内邮件服务器的地址。
- CNAME记录:规范名称记录,用于将域名指向另一个域名,再由另一个域名提供IP地址。
- PTR记录:逆向查询记录,用于从IP地址查询域名。
DNS请求是客户端直接找根域名的服务器,比如www.baidu.com.
。
浏览器开始请求根域名服务器,根域名服务器会返回管理.com
域名的服务器。
浏览器再去请求管理.com
域名的服务器,.com
域名服务器会返回管理baidu.com.
服务器的地址。
浏览器再去请求管理baidu.com.
域名的服务器,baidu.com.
域名服务器会返回管理www.baidu.com.
服务器的地址。
浏览器最后请求管理www.baidu.com.
域名的服务器,拿到IP地址。
3.4 Socket连接
有了Ip地址和端口号(HTTP默认80,HTTPS默认443),浏览器会去创建Socket连接并发送HTTP请求数据。
此时数据交给传输层TCP协议。
3.5 TCP
操作系统会给数据按照MSS分段,并加上TCP头。
TCP头部格式如下。
- 源端口号/目的端口号
- 序号
解决包乱序问题 - 确认序列
目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。 - 首部长度
表示TCP首部有多少个(4字节)的值。 - 状态位
- URG ( urgent pointer) :紧急指针,当URG标志位被设置为1时,紧急指针被用来告诉设备发送的数据包的紧急程度。当标志位被设置为0时,紧急指针不产生任何效果。
- ACK (acknowledgment):确认,当ACK标志位被设置为1时,确认号字段有效。当标志位被设置为0时,确认号无效。
- PSH (push):推,当PSH标志位被设置为1时,接收设备应该立即将这个数据包交给应用程序,而不是缓冲它。
- RST (reset):重置,当RST标志位被设置为1时,这个连接被重置。这通常是因为接收到的数据包与预期不符,或者因为一个会话需要结束。
- SYN (synchronize):同步,当SYN标志位被设置为1时,同步会话开始。这个标志位主要在建立连接时使用,以同步两个设备的状态。
- FIN (finish):结束,当FIN标志位被设置为1时,发送方已经完成了数据传输,因此请求关闭连接。
- 窗口大小
双方都维护一个窗口(缓存大小),标识自己当前能够的处理能力。解决流量控制及拥塞控制问题。 - 校验和
TCP头部和数据部分的校验和,这是一个强制性的字段,由发送端计算和存储,并由接收端进行验证。其主要功能是检查数据在传输过程中是否发生了错误。 - 紧急指针
只在URG位字段被设置时才有效。这个“指针”是一个必须要加到报文段的序列号字段上的正偏移,以产生紧急数据的最后一个字节的序列号。TCP的紧急机制是一种让发送方给另一端提供特殊标志数据的方法。
3.6 IP
主要字段有:
- 源IP/目的IP
若源IP有多个网卡,会将目的地址与路由器中的路由表项进行匹配。规则为 目的地址 & 子网掩码 = 子网网段。若最长匹配,此网卡的ip便作为源IP。若都不匹配,走默认0.0.0.0网关。 - TTL
在IP包的转发过程中,每经过一个路由器,该路由器的TTL计数器就会减1,当TTL计数器为0时,路由器会丢弃该IP包,并向发送端发送ICMP超时报文。 - 协议
指明传输层协议类型。
3.7 MAC
MAC头只有3个字段:源MAC地址、目的MAC地址、网络层协议号(IP、ARP)。
源MAC地址在网卡生产时写入到 ROM 里,获取即可。目的MAC地址则需要通过ARP协议通过IP地址查询缓存或请求获取。
ARP协议
ARP 协议会在以太网中以广播的形式,对以太网所有设备询问IP地址的归属及对应MAC信息。
然后会将IP地址-MAC地址的映射缓存几分钟,用于后续使用。
这个数据没有校验措施,所以存在ARP欺骗。
3.8 网卡
网卡驱动程序会将内核缓冲区复制到网卡内的缓存区中,头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
然后网卡将缓存的二进制数字信息转换为电信号(光纤再来个电光转换器),从网线上发送出去。
3.9 交换机
二层网络设备。交换机端口没有MAC地址。
电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。
计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;交换机则直接全部存到缓冲区
。
交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
如果地址表中找不到指定的 MAC 地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上。
3.9 路由器
三层网络设备。各个端口都具有 MAC 地址和 IP 地址。
电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。
如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包
。
完成包接收操作之后,路由器就会去掉包开头的 MAC 头部
。
MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。所有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址
,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
然后,再次查询路由表。
通过目的ip&子网掩码
匹配到目的地址网段后,再判断网关是否为空。
网关不为空,说明已经到达目标地址。网关为空,说明还需要继续转发。再次通过ARP协议查询MAC地址,并封装MAC包及帧头尾,转为电信号发送出去。