原创
最近更新: 2022/07/29 05:45

计算机通信网络学习笔记

系列目录

计算机通信网络学习笔记

操作系统学习笔记

数据库基础 - MySQL

分布式系统学习笔记


参考资料

CS-Notes-计算机网络

王道考研-计算机网络

1 概论

计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。

功能:数据通信、资源共享、(分布式处理、提高可靠性、负载均衡等)

组成:硬件、软件、协议

功能组成:

  • 通信子网:实现数据通信、osi模型下三层
  • 资源子网:实现资源共享和数据处理、osi模型上三层

计算机网络分层结构

  • 实体:第n层活动的元素称为n层实体,同一层的叫对等实体。
  • 协议:对等实体数据交换的规则、标准或约定。三大要素:语法(传输数据格式)、语义(功能)、同步(操作的顺序)
  • 服务:下层为相邻上层垂直提供的功能调用。
  • 接口:下层为上层提供服务的接口。也叫SAP(Service Accessing Point)服务访问点。

OSI参考模型

  • 应用层:见第四章
  • 表示层:进行数据格式编码的变换、加密解密、压缩恢复等。
  • 会话层:向进程提供建立连接并在连接上有序地传输数据,建立同步。
  • 传输层:见第三章。
  • 网络层:见第二章
  • 数据链路层:将数据报组装成帧。差错控制、流量控制、访问控制。设备:网桥、交换机。
  • 物理层:传输比特流。透明传输:对比特流不加甄别的传输。设备:中继器、集线器(多口中继器),作用是对数据进行放大转发。

TCP/IP参考模型

  • 应用层:HTTP、FTP、DNS等
  • 传输层:TCP、UDP
  • 网络层:IP
  • 网络接口层:Ethernet等
OSI模型 TCP/IP模型
网络层 无连接+面向连接 无连接
传输层 面向连接 无连接+面向连接

2 网络层

  网络层主要任务是把分组从源端传送到目的端,传输单位是数据报。网络的中间节点(通信子网)最高只到网络层。

  • 设备:路由器、网关
  • 功能1:路由选择与分组转发。
  • 功能2:异构网络互联。
  • 功能3:拥塞控制。

2.1 IP数据报格式

  IP数据报的传输采用网络字节序,即大端模式,低地址存放高位,阅读顺序与人类阅读顺序相同。

  IP数据报包括头部和正文两部分,头部由20字节长度的固定部分和可变部分组成,最长为60字节。以下是头部格式:

IP数据报头部

  图中前五行,每行4字节共20字节为固定长度,需要解释的部分含义为:

  • 首部长度:4位,最小值为5,最大值15,即头部长度在4x5~4x15=60之间
  • 总长度:头部+数据部分长度,单位是1B,最长是2^31-1=65535B
  • 标识:同一数据报的所有分段有相同的标识
  • 标志位:DF域:不要分段;MF域:还有更多分段。
  • 偏移:本分段在数据报中的位置;由于分组必须是8B的倍数,每个数据报最多8192个分段,总长度最多为8*8192=65536B
  • TTL:分组寿命,每经过一个路由器-1
  • 协议:上层协议类型,TCP是6,UDP是17
  • 首部校验和:只验证IP分组头,不验证数据;由于TTL不断变化,所以每条链路都要重新计算

2.2 数据交换方式

电路交换

  • 使用物理电路进行数据交换。建立连接、通信、释放连接。
  • 优点:时延小、传输有序、没有冲突、实时性强
  • 缺陷:建立连接时间长、线路独占效率低、灵活性差、无差错控制

报文交换

  • 将报文(信息整体)在交换设备中一级一级进行传输。
  • 优点:无需建立连接、动态分配线路、线路可靠性高、线路利用率高、多目标服务(一个报文可以发给多个目标)
  • 缺陷:有存储转发时延、报文大小不定,需要网络节点有较大缓存

分组交换-数据报

  • 无连接服务:不为传输确定路径,不同分组的传输路径可能不同)
  • 将报文分割成小数据块再传输。每个分组都携带源和目的地址,让路由器自己转发。
  • 在报文交换基础上,存储管理更加容易
  • 有存储转发时延,需要传输额外信息,可能乱序到达需要重新排序

分组交换-虚电路

  • 有连接服务:先为分组的传输决定一条路径,沿该路径传播,传输结束后拆除连接)
  • 将分组交换与电路交换相结合。
  • 构建一条从源主机到目的主机的逻辑路径,路径上所有节点都维护一个虚电路表,所有分组按照这条逻辑路径有序传输。分组只需要使用虚电路号即可。
  • 当虚电路上一个节点失效后,整条虚电路失效。

2.3 ARP地址解析协议

实现从IP地址到MAC地址的映射,即询问目标IP对应的MAC地址。

ARP缓存

用于记录IP地址与MAC地址的映射。

ARP缓存是有生存时间的,结束后会重新发起一轮请求。

ARP请求

  1. 主机A根据主机B的IP地址查询自己的ARP缓存。
  2. 如果没查到,则广播ARP请求。源主机A的IP地址和MAC地址都包括在ARP请求中。
  3. 主机会检查自己的IP地址是否符合,不符合则丢弃。
  4. 主机B验证IP地址后,将主机A的MAC地址放入缓存,并回复自己的MAC地址。
  5. 主机A收到B的回复后,更新自己的ARP缓存。

ARP欺骗

地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。

由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。


3 传输层

3.1 简介

  • 是主机才有的层次,为应用层提供服务,使用网络层的服务。

  • 传输层提供的是进程和进程之间的逻辑通信。

    • 复用:将应用层不同进程的数据进行整合传递给网络层
    • 分用:将网络层的数据分发给应用层的各个进程
  • 传输层的向应用层提供的SAP是端口,用于标识不同的进程号。

    • 端口长度为16bit,最多表示65536个端口号。
  • 服务端-熟知端口号(0~1023),重要应用程序使用的端口号

FTP
文件传输
TELNET
远程登录
SMTP
电子邮件
DNS
域名解析
TFTP
简单文件传输
HTTP
超文本传输
SNMP
简单网络管理
HTTPS
21 23 25 53 69 80 161 443
  • 服务端-登记端口号(1024~49151)
  • 客户端(49152~65535)仅在客户进程运行时才动态分配

3.2 UDP协议

无连接的数据报协议

  • 不可靠、无连接、时延小、适用于小文件。
  • 不需要建立连接,减少开销和时延
  • 首部只有8B:
    • 源端口号
    • 目的端口号
    • UDP整个长度
    • UDP校验和
    • 各2B
  • UDP校验
    • 先在UDP首部前面添加一个12B的伪IP首部(原ip地址,目的ip地址,0、协议域17、UDP长度)
    • 然后对整体(不包括校验和的部分)按每2B(16bit)进行二进制按位求和,取反码,即为UDP校验和。
    • 发送时去掉伪首部。
  • 使用最大努力交付,不保证可靠交付(应用层保障可靠性)
  • 面向报文,适合一次性传输少量数据
  • 应用层给UDP多长的报文,UDP会照样发送,一次发送一个完整报文
  • 没有拥塞控制,适合实时应用

大公司在做通讯工具时往往使用UDP,在应用层自定义协议,实现差错控制等。


3.3 TCP协议

面向连接的传输控制协议

  • 可靠、面向连接、时延大、适用于大文件。
  • 传送数据之前要先建立连接,结束后要释放连接,不提供广播或多播。
  • 开销较大,要提供确认、流量控制、计时器、连接管理等功能。
  • TCP连接是点对点
  • TCP连接提供可靠交付,无差错、不丢失、不重复、按序到达
  • TCP提供全双工通信,提供发送缓存(准备发送&已发送未确认的数据)和接收缓存(按序到达尚未提交的数据&不按序到达的数据)
  • TCP是面向字节流(不确定边界)的,将应用传来的数据看作是无意义的字节流。接收方一般要完整接收完全部报文才能分析内容。

3.3.1 TCP首部

TCP首部

  • 序号(seq):报文序号,随机初始化,每发一个报文+1
  • 确认号(ack):期望收到对方的报文序号,当ACK=1时启用
  • 头部长度:单位为4B,取值范围5~15,与IP报头相同
  • 标志位6位
    • ACK:确认,表示收到对方消息,除了初始报文都要置1
    • SYN:连接请求,握手的前两步置1,其他置0
    • URG:urgent,表示发送方尽快发送,不要排队
    • PSH:push,表示接收方尽快提交数据,不要等缓冲区满
    • RST:reset,表示由于错误等原因要进行重启连接
    • FIN:finish,表示传输完毕,释放连接
  • 窗口大小:用于发送方对接收方进行流量控制
  • 校验和:对校验TCP报头、数据、伪IP头进行数据校验
  • 紧急指针:标记紧急数据部分的长度

3.3.2 TCP连接管理

三次握手

TCP三次握手

  1. 客户端主动发起连接
    • 连接请求SYN=1
    • 确认ACK=0(发起)
    • 序号seq=x(初始化)
  2. 服务器被动接受连接
    • 连接请求SYN=1
    • 确认ACK=1
    • 确认号ack=x+1(确认收到x,期望收到x+1)
    • 序号seq=y(初始化)
  3. 客户机开始传送数据
    • 连接请求SYN=0(请求结束)
    • 确认ACK=1
    • 确认号ack=y+1(确认收到y,期望收到y+1)
    • 序号seq=x+1
    • 数据部分

为什么不是两次握手?

因为通信是全双工的,要保证双方都至少接收一次ACK后,才确认连接已建立。

如果只有两次握手,那么服务器在收到 SYN 之后就直接进入 ESTABLISHED 状态,可能会出现服务器返回的 ACK 丢失的现象,此时客户端无法进入 ESTABLISHED 状态。

至于为什么不是四次握手,和四次挥手相比较,可以看出是将2、3两步结合在一起,无须多一次握手。

SYN洪泛攻击

攻击者不断发送SYN请求,且不返回确认,服务器会不断重复发送确认信息,消耗资源。

四次挥手

TCP四次挥手

  1. 客户端主动结束,进入等待结束状态
    • 结束FIN=1
    • ACK=1
    • seq=u
    • 数据
  2. 服务端收到请求,进入等待关闭状态
    • ACK=1
    • ack=u+1
    • seq=v
    • 数据
  3. 服务端发送若干数据后,被动结束
    • 结束FIN=1
    • ACK=1
    • ack=u+1(客户端已经不再发送请求,ack不变)
    • seq=w
  4. 客户端收到结束请求,发送最后的ACK
    • ACK=1
    • seq=u+1
    • ack=w+1
  5. 服务器收到最后的ACK,关闭连接
  6. 客户端等待两个 MSL(Maximum Segment Lifetime,最大报文生存期,一般为两分钟)后,确认服务器已经关闭,自己也关闭

TCP状态图

TCP状态图

CLOSED :关闭,初始状态。

LISTEN :服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_RCVD:这个状态表示接受到了SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,收到客户端的ACK后就结束。

SYN_SENT:与SYN_RCVD类似,SYN_SENT状态表示客户端已发送SYN报文。客户端发出连接后,并等待服务端的发送三次握手中的第2个报文时的状态。

ESTABLISHED :三次握手后双方的状态,表示连接已经建立了。

FIN_WAIT_1:当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:客户端等待服务器的FIN。表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。

  • MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,一般是半分钟到两分钟。
  • 等待2MSL时间主要目的是
    • 怕最后一个ACK包对方没收到而重发FIN报文。
    • 可能会出现结束这个连接后立刻建立一个相同的连接,此时应保证网络中没有残余的报文。
  • 在高并发短连接且主动关闭连接的服务器中可能会出现大量连接处于TIME_WAIT状态,占用大量服务器网络资源。
    • 解决方法:调整tcp参数,如MSL、最大TIME_WAIT套接字数量等

CLOSING:双方几乎同时发出FIN报文,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。

CLOSE_WAIT :当对方发送FIN报文后,己方回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。如果还有数据发送给对方则继续发送,否则也发送FIN报文给对方,即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。


3.3.3 TCP可靠传输

TCP重传机制

快速重传

假设此时有1、2、3、4共四个报文要发送,发送方按顺序发送了四个报文,其中2号报文丢失或错误。

接收方接收到1号报文,返回ack=2;

接收方接收到3号报文,返回ack=2;

接收方接收到4号报文,返回ack=2;

接收方会缓存未按序到达的3、4号报文。

发送方收到3个ack=2,认为2号报文丢失,重传2号报文。

超时重传

TCP每发送一个报文段,就会启动一个计时器。当某个ack超时,发送方也认为丢失,重传。

TCP流量控制

滑动窗口

发送和接收双方都有发送窗口和接收窗口,在发起连接或数据通信时,双方都会根据自己的接收窗口大小和服务器、网络状态,在TCP报头中的窗口字段中赋予合适的值,来调控对方的发送窗口。

例如,当把窗口大小设置为0,则意味着让对方暂停发送消息。

TCP拥塞控制

慢开始和快重传

慢开始和快重传

拥塞窗口会根据网络情况动态调整。最开始是指数增大,达到门限值ssthresh后变成线性增大。当网络出现拥塞,如丢包,则减小门限值到当前拥塞窗口的一半,同步调整拥塞窗口。

发送方会根据流量控制的滑动窗口值和拥塞窗口值对自己的发送窗口进行动态调整。


4 应用层

功能:文件传输FTP、电子邮件SMTP,POP3、网页服务HTTP、域名解析DNS

常用模型

客户/服务器模型

  • 服务器:永久提供服务、拥有永久地址/域名
  • 客户机:使用服务、间歇性接入网络、IP地址不固定、不直接与客户机通信

P2P模型

  • 不存在永远在线的服务器
  • 每个节点都可以提供或请求服务
  • 节点之间可以直接通信
  • 每个节点都间歇性接入网络,IP地址不固定
  • 可扩展性和可靠性好

DNS域名解析服务

使用UDP连接,使用53端口。

包含跟域名服务器、顶级域名服务器、权限域名服务器,按树形层次排列。

一般浏览器在输入网址之后,会现在缓存中查询IP地址,包括:

  1. 浏览器缓存
  2. 系统缓存
  3. 路由器缓存
  4. ISP缓存

然后才是迭代地查询各级DNS服务器。

DNS查询过程

FTP文件传输协议

使用TCP连接,适合大文件传输。

连接进程使用21端口,数据传送进程使用20端口。

TFTP协议

简单文件传输协议,基于UDP实现,端口号为69。

开销小,适合进行小文件传输。

HTTP超文本传输协议

详见HTTP协议详解

使用TCP连接,80端口。

非持久连接:

  • 建立TCP连接
  • 客户机向服务器请求文档
  • 服务器返回文档
  • 释放TCP连接

持久连接:服务器返回资源后,保持连接,以便后续客户机继续请求资源

HTTP报文结构

HTTP请求报文结构

请求方法主要是POST和GET两种,其中

  • GET提交的数据存放在URL当中

    • 不适合用于存放敏感内容
    • 会被浏览器历史记录保存,重新访问时参数保留
  • POST提交的数据存放在请求的报文体当中

    • 有更灵活的编码方式
    • 参数不会被保留,刷新之后要重新提交

HTTP状态码

  • 1xx 信息,服务器收到请求,需要请求者继续执行操作
    • 100 继续
  • 2xx 成功,操作被成功接收并处理
    • 200 OK
    • 201 已创建
    • 202 已接受,但尚未处理完成
  • 3xx 重定向,需要进一步的操作以完成请求
    • 301 Moved Permanently 永久移动。
    • 302 Moved temporarily 临时移动。
  • 4xx 客户端错误,请求包含语法错误或无法完成请求
    • 400 Bad Request 请求的语法错误
    • 401 Unauthorized 用户身份未认证
    • 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
    • 404 Not Found 服务器无法根据客户端的请求找到资源(网页)
  • 5xx 服务器错误,服务器在处理请求的过程中发生了错误
    • 500 Internal Server Error 服务器内部错误,无法完成请求
    • 502 Bad Gateway 网关收到了无效的响应,可能是由于服务器负载过大导致的
    • 504 Gateway Time-out 远程服务器响应超时

HTTP 2.0

SPDY协议

SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。

SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。

二进制分帧

在应用层(HTTP)和传输层(TCP)之间增加一个二进制分帧层。

基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。

在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码

在二进制分帧层中, HTTP2.0会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到HEADER frame,而相应的Request Body则封装到DATA frame里面。

首部压缩

HTTP2.0使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。

在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

多路复用

允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。

即用户端同时发送多条请求,服务端也同时响应多条请求。

服务器推送

服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。

比如,当服务器响应页面的时候,会同时推送图片、样式表等内容。


HTTPS

HTTPS 协议是在TCP与HTTP层之间插入了TLS/SSL协议构建的。使用443端口。

HTTPS 相比于 HTTP 具有很好的安全性,但加密需要消耗大量CPU资源,且时延更高。

可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。设计目标主要有三个:

  • 数据保密性:保证数据内容在传输的过程中不会被第三方查看。

    • 通过对称加密方法加密正文,并使用接收方公钥加密对称密钥。
  • 数据完整性:及时发现被第三方篡改的传输内容。

    • 使用消息摘要机制,将数字签名用非对称方法加密传输。
  • 身份校验安全性:保证数据到达用户期望的目的地。

    • 基于数字证书的身份认证机制,确保浏览器访问的网站是经过CA验证的可信任网站。

浏览器输入URL后发生了什么?

浏览器首先会解析输入的URL,将其中域名和文件的部分分离,然后根据对域名进行解析,详见:

DNS解析

获取到IP地址之后,浏览器会构建HTTP请求,一般是GET和POST。

HTTP请求

如果是HTTPS的请求,还会使用SSL/TSL进行加密,以保证连接的安全。

HTTPS加密

浏览器会先检查自己的缓存,看是否已经有对应页面的缓存,没有的话会将数据包交给传输层,并构建TCP连接。主要是三次握手过程。

TCP连接

连接建立之后,浏览器从服务器处获取了页面文件,接下来就是对网页的渲染等操作。

评论区