计算机网络相关

计算机网络相关的一些问题

Posted by ZBX on April 13, 2020

而一般以太网MTU都为1500, 所以在以太网中, 往往TCP MSS为1460。

Syn Flood

  • 攻击者首先伪造地址对服务器发起SYN请求,服务器就会回应一个ACK+SYN(可以+请确认)。而真实的IP不作回应。服务器没有收到回应,会重试3-5次并且等待一个SYN Time(一般30秒-2分钟)后,丢弃这个连接。

  • 如果攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源来处理这种半连接,保存遍历会消耗非常多的CPU时间和内存。

|8字节前导码|6字节目的MAC地址|6字节源MAC地址|2字节上层协议类型|20字节IP头|20字节TCP头|6字节以太网填充|4字节CRC检验|12字节帧间距|
//一个本来只有40字节的SYN包,在网络上传输时占的带宽,其实是84字节。

防御手段

  • Filtering
  • Increasing backlog
  • Reducing SYN-RECEIVED timer
  • Recycling the oldest half-open TCP
  • SYN cache
  • SYN cookies : Syn Cookie生成不同操作系统的实现,一般都由若干密钥、时间、MSS以及四元组决定。
  • Hybrid approaches
  • Firewalls and proxies
  • 丢包模式,利用TCP重传机制,丢弃首个 Syn 包。
  • 反向探测,即向Client发送探测包。
  • 代理模式,即Syn Proxy,把DDoS设备当成代理。由DDOS防护系统来响应syn。这种模式类似于目前负载均衡设备的功能,防御设备先伪造Server与Client建立连接, 然后再与Server建立连接,双向连接建立好之后再进行数据转发。

在浏览器中输入url地址

没有IP的话,还有DHCP 配置主机信息这一步骤。

没有路由器地址,还有ARP 解析 MAC 地址这一步。

  1. 浏览器查找域名的IP地址 (DNS查找如下:)
    1. 浏览器缓存->系统缓存->网络配置中的”DNS服务器地址” ,本地域名服务器
    2. 如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析
    3. 根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右
    4. 本地域名服务器LDNS再向上一步返回的gTLD服务器发送请求
    5. 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是用户注册的域名服务器,例如用户在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成
    6. 返回该域名对应的IP和TTL值,LDNS会缓存这个域名和IP的对应关系,缓存时间由TTL值控制
    7. 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束
  2. 浏览器向web服务器发送一个HTTP请求,
    1. 建立TCP连接、为了方便通信,将HTTP请求报文分割成报文段,按序号分为多个报文段,把每个报文段可靠地传给对方。
    2. 封装成IP数据报,MAC帧,比特流,发给网关,途中可能有交换机,路由器转发,访问控制列表ACL,NAT地址转换、使用路由协议转发,查找路由表,
    3. 每经过一个路由器,都要重新计算IP数据报的检验和
  3. 服务器处理请求
    1. 重组到达的报文段,按序号以原来的顺序重组报文
    2. 解析HTTP的报文中的内容,GET、POST
  4. 服务器发回一个HTML响应
    1. 路由转发、NAT、ACL
  5. 浏览器解析渲染页面
    1. 一层一层解析

应用层

FTP

FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:

  • 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
  • 数据连接:用来传送一个文件数据。

DHCP

  1. 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
  2. DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
  3. 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
  4. DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。

DNS

在两种情况下会使用 TCP 进行传输:

  • 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
  • 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。

电子邮件协议

  • SMTP、MIME、POP3、POP3、IMAP

传输层

UDP

  • 首部字段只有8个字节,包括源端口、目的端口、长度、校验和。12字节的伪首部是为了计算校验和临时添加的。

TCP

  • 序号、确认号、数据偏移、确认ACK、同步SYN、终止FIN、窗口等
  • 滑动窗口
    • 窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
  • 可靠传输
    • 超时重传来实现可靠传输
  • 流量控制
    • 流量控制是为了控制发送方发送速率,保证接收方来得及接收。
    • 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
  • 拥塞控制:发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量
    • 慢开始与拥塞避免
      • 令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
      • 当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1
      • 如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始
    • 快重传与快恢复
      • 发送方收到三个重复确认,此时执行快重传,立即重传下一个报文段。
      • 在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

为什么三次握手?

三次握手主要的目的是双方确认自己与对方的发送与接收是正常的。

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

四次挥手的原因

客户端发送FIN连接释放报文之后,服务器收到了这个报文,就进入了CLOSE-WAIT状态。这个状态是为了让服务器发送还未传送完毕的数据,传送完毕之后,服务器会发送FIN连接释放报文。

粘包、拆包

要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

  • 消息定长。发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
  • 设置消息边界。服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如FTP协议。
  • 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段。
  • 更复杂的应用层协议,比如Netty中实现的一些协议都对粘包、拆包做了很好的处理。Netty 中的拆包器 :固定长度的拆包器、行拆包器、分隔符拆包器、基于数据包长度的拆包器

网络层

网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。

IP数据报首部

  • 版本4位、首部字段4位、区分服务8位、总长度16位、生存时间TTL8位、协议8位、首部校验和16位、标识16位、片偏移13位

划分

  • A类地址:最高位必须是“0”, 范围为:1.0.0.1-126.255.255.254;

  • B类地址:最高位必须是“10”,, 范围为:128.1.0.1-191.255.255.254;

  • C类地址:最高位必须是“110”, 范围为:192.0.1.1-223.255.255.254

  • D类地址:第一个字节以“lll0”开始,多点广播(Multicast)中。

  • E类地址:以“llll0”开始,为将来使用保留。

  • 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:

    A类地址:10.0.0.0~10.255.255.255

    B类地址:172.16.0.0~172.31.255.255

    C类地址:192.168.0.0~192.168.255.255

  • 无分类编址

    • 一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网

ARP地址解析协议

  • ARP 实现由 IP 地址得到 MAC 地址。

  • 每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。

  • 如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。

网际控制报文协议ICMP

  • ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。

  • ICMP 报文分为差错报告报文和询问报文。

Ping

测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

Traceroute

用来跟踪一个分组从源点到终点的路径。

  • 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
  • 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
  • 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
  • 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。

VPN虚拟专用网

VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。

网络地址转换NAT

NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。

路由器的结构

路由选择和分组转发。

路由协议

  • RIP:跳数最多为 15,超过 15 表示不可达。
  • OSPF:最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
  • BGP:BGP 只能寻找一条比较好的路由,而不是最佳路由。

数据链路层

两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻的节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点之间的链路上传送帧。

基本问题

  1. 封装成帧
    • 将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
  2. 透明传输
    • 透明表示一个实际存在的事物看起来好像不存在一样。
  3. 差错检测
    • 使用了循环冗余检验(CRC)来检查比特差错。

信道分类

  • 广播信道
  • 点对点信道,PPP

信道复用技术

  • 频分复用:所有主机在相同的时间占用不同的频率带宽资源

  • 时分复用:所有主机在不同的时间占用相同的频率带宽资源。

  • 统计时分复用:不固定每个用户在时分复用帧中的位置,只要有数据就集中起来组成统计时分复用帧然后发送。

  • 波分复用:光的频分复用。由于光的频率很高,因此习惯上用波长而不是频率来表示所使用的光载波。

  • 码分复用:当接收端使用码片S对接收到的数据进行内积运算时,结果为 0 的是其它用户发送的数据,结果为 1 的是用户发送的比特 1,结果为 -1 的是用户发送的比特 0。

    码分复用需要发送的数据量为原先的 m 倍。

CSMA/CD协议

  • 多点接入
  • 载波监听
  • 碰撞检测

记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为 争用期 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。

当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 截断二进制指数退避算法 来确定。从离散的整数集合 {0, 1, .., (2k-1)} 中随机取出一个数,记作 r,然后取 r 倍的争用期作为重传等待时间。

PPP协议

互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。 PPP 的帧格式:

  • F 字段为帧的定界符
  • A 和 C 字段暂时没有意义
  • FCS 字段是使用 CRC 的检验序列
  • 信息部分的长度不超过 1500

以太网

以太网帧格式:

  • 目的地址和源地址,共12字节
  • 类型 :标记上层使用的协议;
  • 数据 :长度在 46-1500 之间,如果太小则需要填充;
  • FCS :帧检验序列,使用的是 CRC 检验方法;

交换机

  • 交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。

VLAN

  • 虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。

  • IEEE 定义了一种扩展的以太网帧格式 802.1Q,它在标准以太网帧上加进了 4 字节首部 VLAN 标签,用于表示该帧属于哪一个虚拟局域网。

物理层

在物理层所传输的数据单位是比特,物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。

  • 单工通信:单向传输
  • 半双工通信:双向交替传输
  • 全双工通信:双向同时传输

带通调制把数字信号转换为模拟信号。