从输入URL到显示-网络篇

148 阅读48分钟

URL 解析

  • 协议+域名+端口号+页面参数

端口号

  • 服务器端口范畴为 0-65535

域名

  • 输入关键字的话会通过默认引擎生成一个域名
  • 访问一个域名时,首先要把域名转换成 ip 地址 然后再将 ip 转换成 mac 地址 mac 为每个主机唯一的一个标识

DNS 服务器

  • 作用 通过DNS协议映射把域名转换成ip

  • 原理 基于udp 因为需要查找服务器 如果是基于TCP每次都三次握手四次挥手 性能差劲

  • 域名空间结构

    • 根域 全球的 13 台根逻辑域名服务器 单个.或.结尾的名称
    • 顶级域 用于指示某个国家/地区或者组织使用的名称 .com .cn .top
    • 组织域
    • 国家/地区域名
    • 二级域名 个人或者组织在网络上注册名称 kln.com kgk.cn
    • 子域 已注册的二级域名派生的域名 www.kln.com
  • DNS 域名称

    • cn 中国
    • ru 俄罗斯
    • com 商业公司
    • net 网络公司
    • edu 教育机构
    • Mill 军事政府机构
    • gov 非军事政府机构
  • DNS 服务器

    • 查找过程
    • 找缓存 递归查找
      1. 查询浏览器缓存
      2. 查询本地 HOST 文件
      3. 查询本地 DNS 解析器
      4. 本地 DNS 服务器
      5. 定位最近的 LDNS 服务器
      6. ...
      7. 13 个根服务器
    • 如果没有缓存 迭代查询
      • 客户端向本地域名服务器发出请求,我要访问www.163.com,请告诉我它的IP地址
      • 本地 DNS 服务器向 DNS 根服务器发出请求,根 DNS 服务器会告诉本地服务器(.com)的服务器地址
      • 本地 DNS 服务器会向(.com 域)发请求,会得到(163.com)的服务器地址
      • 本地 DNS 服务器会向(163.com)发请求,会得到(www.163.com)的IP地址1.1.1.1
      • 本地 DNS 服务器向客户端回复域名(www.163.com)对应的IP地址是1.1.1.1
    • 优化点
      • 减少 DNS 解析
      • NDS 预获取

CDN 服务器

  • 就近访问原则 将资源文件存储在 CND 服务器上 然后根据 LDNS 提供的定位位置 来获取就近的 CDN 服务器上的数据
  • 比如: 北京的用户输入了www.baidu.com dns 服务器会通过 ldns 定位到我们的 IP 输入北京 然后就会请求北京 CDN 服务器的数据了
  • 问题点 如果深圳用户使用了北京的 IP 定位使用的还是北京的 CND 服务器 所以就有了 HTTP 调度

HTTP 调度

  • 通过增加 DNS 解析,客户端请求全部被引导至调度中心服务器,双方通过 HTTP 协议直接建联
  • http 调度和传统 CND 解析的区别在于 HTTP 调度能精准的定位到用户的位置 从而传给 CND 服务器的定位地址准确度很高 而传统解析 会因为 LDNS 的误差 而导致传给 CND 服务器的定位不同

协议 HTTP or HTTPS

HTTP 通用能力

  •  http 协议和 tcp 协议的流程图
  • HTTP 是一个无状态的协议 无状态就表示不知道发送方是谁
  • 请求报文
  • 响应报文
  • 编码
    • HTTP 可以在传输的过程中通过编码提升传输效率,但是会消耗更多的 CPU 时间。
  • 编码压缩 发送文件时可以先用 ZIP 压缩功能后再发送文件
    • gzip
    • compress
    • deflate
    • identify
  • 分割发送的分块传输编码
    • 请求的实体在尚未传输完成前浏览器不能显示。所以在传输大容量数据时,通过把数据分割成多块,能让浏览器逐步显示页面
  • 多部分对象集合
    • 一份报文主体中可以包含多类型实体。
    • 使用 boundary 字符串来划分多部分对象指明的各类实体。在各个实体起始行之前插入--标记,多部分对象集合最后插入--标记
    • multiparty/form-data 上传表单时使用
    • multipart/byteranges 206 状态码(Partical Content)响应报文中包含多个范围时使用
  • 状态码
    • 1xx 信息性状态码
    • 2xx 成功状态码
    • 3xx 重定向
    • 4xx 客户端错误
    • 5xx 服务端错误
      • 200(OK 客户端发过来的数据被正常处理
      • 204(Not Content 正常响应,没有实体
      • 206(Partial Content 范围请求,返回部分数据,响应报文中由 Content-Range 指定实体内容
      • 301(Moved Permanently) 永久重定向
      • 302(Found) 临时重定向,规范要求方法名不变,但是都会改变
      • 303(See Other) 和 302 类似,但必须用 GET 方法
      • 304(Not Modified) 状态未改变 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
      • 307(Temporary Redirect) 临时重定向,不该改变请求方法
      • 400(Bad Request) 请求报文语法错误
      • 401 (unauthorized) 需要认证
      • 403(Forbidden) 服务器拒绝访问对应的资源
      • 404(Not Found) 服务器上无法找到资源
      • 500(Internal Server Error)服务器故障
      • 502(Service Unavailable) 服务器处于超负载或正在停机维护
  • HTTP 报文字段
    • 请求和响应报文首部通用的字段
      • Cache-Control 控制缓存行为
      • Connection 长链接
      • Date 报文日期
      • Pragma 报文指令
      • Trailer 报文尾部的首部
      • Trasfer-Encoding 指定报文主体的传输编码方式
      • Upgrade 升级为其他协议
      • Via 代理服务器信息
      • Warning 错误通知
    • 请求报文首部字段
      • Accept 用户代理可处理的媒体类型
      • Accept-Charset 优先的字符集
      • Accept-Encoding 优先的编码
      • Accept-Langulage 优先的语言
      • Authorization web 认证信息
      • Expect 期待服务器的特定行为
      • From 用户的电子邮箱地址
      • Host 请求资源所在的服务器
      • If-Match 比较实体标记
      • If-Modified-Since 比较资源的更新时间
      • If-None-Match 比较实体标记
      • If-Range 资源未更新时发送实体 Byte 的范围请求
      • If-Unmodified-Since 比较资源的更新时间(和 If-Modified-Since 相反)
      • Max-Forwards 最大传输跳数
      • Proxy-Authorization 代理服务器需要客户端认证
      • Range 实体字节范围请求
      • Referer 请求中的 URI 的原始获取方
      • TE 传输编码的优先级
      • User-Agent HTTP 客户端程序的信息
    • 响应报文首部字段
      • Accept-Ranges 是否接收字节范围
      • Age 资源的创建时间
      • ETag 资源的匹配信息
      • Location 客户端重定向到指定的 URI
      • Proxy-Authenticate 代理服务器对客户端的认证信息
      • Retry-After 再次发送请求的时机
      • Server 服务器的信息
      • Vary 代理服务器缓存的管理信息
      • www-Authenticate 服务器对客户端的认证
    • 实体首部字段
      • Allow 资源可支持的 HTTP 方法
      • Content-Encoding 实体的编码方式
      • Content-Language 实体的自然语言
      • Content-Length 实体的内容大小(字节为单位)
      • Content-Location 替代对应资源的 URI
      • Content-MD5 实体的报文摘要
      • Content-Range 实体的位置范围
      • Content-Type 实体主体的媒体类型
      • Expires 实体过期时间
      • Last-Modified 资源的最后修改时间
  • web 服务器
    • 虚拟主机 一台 HTTP 服务器上搭建多个 Web 站点,客户端发送请求时必须在 Host 首部完整指定主机名或域名的 URL
    • 代理
    • 为什么要使用代理
      • 利用缓存技术减少网络流量
      • 组织内部针对网站进行访问控制
      • 获取访问日志
    • 代理分类
      • 缓存代理 会预先把资源副本保存在服务器上
      • 透明代理 不对报文进行任何加工

HTTP1

  • http1.1 的报文内容都是字符串拼接出来的
  • 管线化
    • HTTP2 之前的请求发送是串行的 上一次 http 请求回来才能发下一个请求
    • 管线化解决了请求时的并发 可以同时发送多个请求 但是响应还是按照请求的顺序来响应的 如果第一个请求的响应没有完成 就算第二个的请求完成了也不会给客户端返回来 产生的问题(队头阻塞)
  • 长链接
    • 之前的数据交互是每次都要进行建立 TCP 通道 然后 HTTP 请求/响应完 关闭通道 这样次数多了之后 会产生大量的通信开销
    • 所以改进成 只开一次 tcp 通道 不关闭 也就是长链接(三次握手四次挥手代表着 TCP 的开启与关闭)
    • 长链接

HTTP2

  • 二进制分帧 具有帧和流的概念 还有独立的流 ID 对TCP进行了更细致的分化
    • 同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
  • 多路复用 解决了管线化的问题 同个域名只需要占用一个 TCP 连接
    • http2 中将多个请求复用同一个 tcp 链接中,将一个 TCP 连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个 request-response 拆分为了细小的二进制帧 Frame,这样即使一个请求被阻塞了,也不会影响其他请求
  • 服务器推送
    • 服务端可以在发送页面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 时再发送这些请求。
    • 服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送 RST_STREAM 帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。
  • 头部压缩
    • HTTP/2 对消息头采用 HPACK(专为 http/2 头部设计的压缩格式)进行压缩传输,能够节省消息头占用的网络的流量
    • HTTP/2 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
    • 首部表在 HTTP/2 的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
    • 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。

HTTP3

  • 摒弃 TCP 使用 UDP+QUIC http2 和 http3 的协议区别

HTTPS

  • SSL+TLS TLS 是 SSL 里的标准

  • 传输层安全性协议(Transport Layer Security,缩写 TLS),及其前身安全套接层(Secure Sockets Layer,缩写 SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障

  • SSL+TLS 的功能主要依赖于三类基本算法 散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性

  • SSL 协议

    • 散列函数 散列函数验证信息的完整性 md5 SHA256
      • 函数不可逆
      • 对输入敏感
      • 输出长度固定
      • 常见的有 MD5、SHA1、SHA256,该类函数特点是函数单向不可逆、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性;
      • 在信息传输过程中,散列函数不能单独实现信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密;
    • 对称加密 对称加密算法采用协商的密钥对数据加密
      • 常见的有 AES-CBC、DES、3DES、AES-GCM 等,相同的密钥可以用于信息的加密和解密,掌握密钥才能获取信息,能够防止信息窃听,通信方式是 1 对 1;
      • 对称加密需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和多 个客户端通信,需要维持多个密码记录,且缺少修改密码的机制;
      • 优点:算法公开、计算量小、加密速度快、加密效率高。
      • 缺点:交易双方都使用同样钥匙,安全性得不到保证。
      • 1 对 1 服务端和客户端共享相同密钥
      • 不同客户端的密钥不同
      • 服务器维护多个密钥
      • 密钥协商是安全基础
    • 非对称加密 非对称加密实现身份认证和密钥协商 RSA 加密算法
      • 1 对多 客户端共享公钥
      • 服务端掌握私钥
      • 客户端信息只能服务端解密
      • 客户端向服务器发送唯一信息
      • 即常见的 RSA 算法,还包括 ECC、DH 等算法,算法特点是,密钥成对出现,一般称为公钥(公开)和私钥(保密),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。因此掌握公钥的不同客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通信,服务器可以实现 1 对多的通信,客户端也可以用来验证掌握私钥的服务器身份。
      • 非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密速度慢。
    • 工作方式
      • 客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥
      • 然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。
    • SSL 协议方式
      • 第一层是记录协议 用于定义传输格式
      • 第二层是握手协议 他建立在 SSL 记录协议之上 用在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
    • SSL 密钥协商的过程
      • client_hello 过程
        • 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息 相关信息如下:
        • 版本信息: 支持的最高 TSL 协议版本 version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本
        • 加密套件候选列表(cipher suite): 认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验);
        • 压缩算法候选列表:支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;
        • 随机数:随机数就是上图里的 RNc,用于后续生成协商密钥;
        • 协商数据:支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。
        • client_hello 流程图
      • server_hello 过程
        • 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 RNs 等,其中随机数用于后续的密钥协商;
        • 服务器证书链,用于身份校验和密钥交换
        • 通知客户端 server-hello 结束,请求客户端的证书和密钥
      • 证书校验,协商最后通信密钥
        • 客户端验证服务端证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:
          • 证书链的可信性 trusted certificate path
          • 证书是否吊销 revocation
          • 有效期 expiry date,证书是否在有效时间范围;
          • 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; b. 客户端发送客户端证书,公钥服务端验证(过程同客户端验证) c. 客户端 hash 所有之前的消息,发送 hash 值和摘要,用客户端的私钥加密发送给服务端,服务端用客户端的公钥解密,验证了服务端获取的客户端的公钥和算法是正确的 d. 客户端生成 pms,用服务端的公钥加密后发送给服务端 e. 客户端和服务端同时计算出最终会话密钥(MS)
      • 验证协商密钥
        • Client 发送 ChangeCipherSpec,指示 Server 从现在开始发送的消息都是加密过的 b. Client 发送 Finishd,包含了前面所有握手消息的 hash,可以让 server 验证握手过程是否被第三方篡改 c. 服务端发送 ChangeCipherSpec,指示 Client 从现在开始发送的消息都是加密过的 d. Server 发送 Finishd,包含了前面所有握手消息的 hash,可以让 client 验证握手过程是否被第三方篡改,并且证明自己是 Certificate 密钥的拥有者,即证明自己的身份
      • HTTPS 完整建立连接过程
        • 首先建立 tcp 握手连接
        • 进行 ssl 协议的握手密钥交换(Handshake protocal)
        • 然后通过共同约定的密钥开始通信
        • https 建立成功
  • 数字签名 数字签名的基本原理是用私钥去签名,而用公钥去验证签名

  • 数字证书 数字证书是一个由可信的第三方发出的,用来证明所有人身份以及所有人拥有某个公钥的电子文件

    • 证书作用
      • 证书的作用就是,我和服务端通信,我怎么知道这个服务端是我要真正通信的服务端呢
    • 申请和发放证书流程
      • 服务方 Server 向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证;
      • CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
      • 如信息审核通过,CA 会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名; 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;
      • 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
      • 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
      • 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任 CA 的证书信息(包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
      • 证书申请流程图
  • 证书链

    • 服务器证书 server.pem 的签发者为中间证书机构 inter,inter 根据证书 inter.pem 验证 server.pem 确实为自己签发的有效证书
    • 中间证书 inter.pem 的签发 CA 为 root,root 根据证书 root.pem 验证 inter.pem 为自己签发的合法证书;
    • 客户端内置信任 CA 的 root.pem 证书,因此服务器证书 server.pem 的被信任。
    • 服务器证书、中间证书与根证书在一起组合成一条合法的证书链,证书链的验证是自下而上的信任传递的过程。
    • 证书链

缓存检查

  • 缓存检查
    • URL 解析完之后 先查看有没有缓存
    • 强缓存且未失效 走强缓存
    • 没有或者失效 看是否有协商缓存
    • 有 走协商缓存
    • 无 请求服务器
    • 缓存位置
      • 内存缓存 存在内存条里 页面关闭就没了
      • 硬盘缓存 存在硬盘里
      • 打开页面 先查看硬盘缓存里是否有匹配 如果有则使用 没有则发送网络请求
      • 普通刷新 F5 使用内存缓存 如果内存可以 就优先使用 不可用在找硬盘缓存
      • 强制刷新 不使用缓存 发送的请求头带有 Cache-control no-cache 服务器返回最新内容
    • 强缓存 Expires / Cache-Control
      • Expires 缓存过期时间 (HTTP1.0 使用)
      • Cache-Control cache-control;max-age=2592000(一个月)(HTTP1.1)
      • 同时存在 Cache-Control 优先级高于 Expires
      • 缺点解决方式 (服务器资源更新 还是走缓存)
          1. 服务器资源更新后 更改资源名称 wabpack hash name
          1. 文件更新 加时间戳
    • 协商缓存 Last-Modeified(资源文件最后的更新时间)HTTP1.0/ETag(标识 资源文件更新生成的 每一次都会生成新的)HTTP1.1
      • 不管本地有没有缓存 浏览器都要携带缓存标识去请求服务器(if-Modifined-Since/if-None-Match)
      • 服务器根据资源文件是否更新
        • 如果资源没更新 返回 304
        • 如果 更新 返回 200
          • 浏览器根据状态码 如果是 304 去缓存找资源 如果是 200 直接渲染 并且把信息缓存到本地

网络基础

OSI七层网络模型 Open System Interconnection

  • 七层划分

    • 应用层(Application) 提供网络与用户应用软件之间的接口服务(HTTP)
    • 表示层(Presentation) 提供格式化的表示和转换数据服务,如加密和压缩()
    • 会话层(Session) 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制()
    • 传输层(Transimission) 提供建立、维护和取消传输连接功能,负责可靠地传输数据(TCP)
    • 网络层(Network) 处理网络间路由,确保数据及时传送(路由器)
    • 数据链路层(DataLink) 负责无错传输数据,确认帧、发错重传等(交换机)
    • 物理层(Physics) 提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器)
  • 四层网络模型

    • 应用层 传输层 网络层 网络接口层
  • 五层网络模型

    • 应用层 传输层 网络层 数据链路层 物理层
  • 概念理解

    • 以发书信为例
      • 书信的内容属于 应用层 表示层 会话层的集合
      • 应用层表示 想要传递的什么内容 比如 我想你
      • 表示层 是用什么形式来承载应用层要表示的内容 我想你 这三个字用中文还是英文还是别的文字 是种表现形式
      • 会话层 是一种机制 和规范
      • 传输层 相当于 邮局通信
      • 网络层 寻址 根据收件人信息 找到最快能到达收件人地址的道路
      • 数据链路层 书信在传输过程中丢失 会有什么操作
      • 物理层 邮局去给收件人送件是走铁路还是公路 传输形式
  • 数据传输

    • 数据发送要经历的阶段 (发送方)
      • 应用层 传输的数据 列如 js的 let name =10; === 数据源
      • 传输层 给应用层的数据加一个TCP头部信息 数据源变成了 TCP头 + 数据源 === 数据段
      • 网络层 给传输层的数据加一个IP头部信息 数据源变成了 IP头+ TCP头 + 数据源 ==== 数据包
      • 数据链路层 给网络层的数据加一个MAC头部信息 和 尾部信息 数据源变成了 MAC头部+IP头+TCP头+数据源+尾部 === 比特流(bit)
      • 物理层 把比特流(bit)传输给接收方
    • 数据发送要经历的阶段 (接收方) 解封装操作
      • 物理层 接收 发送方传进来的比特流(bit)
      • 数据链路层 去除MAC头部和尾部 数据源===IP头+TCP头+数据源
      • 网络层 去除IP头 数据源===TCP头+数据源
      • 传输层 去除TCP头 数据源===数据源
      • 应用层 获取 发送方要传给接收方的实际数据

网络层 传输层 应用层 的协议

  • 网络层 传输层 应用层 每一层都是一个协议集合 有很多协议
  • 应用层常见协议
    • HTTP 超文件传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议
    • FTP 文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式
    • TFTP Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议
    • SMTP 简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输Email的事实标准
    • SNMP 简单网络管理协议(SNMP,Simple Network Management Protocol),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象,该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。
    • POP3 (接收邮件)
    • DNS 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
  • 传输层常用协议
    • TCP Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
    • UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
  • 网络层常用协议
    • ICMP (Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息
    • IGMP Internet 组管理协议称为IGMP协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间
    • IP 互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签
    • ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议
    • RARP 反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址

网络接口层(物理层+数据链路层)

物理层

网络接口层是TCP/IP模型的最底层,负责接收从上一层交来的数据报并将数据报通过底层的物理网络发送出去,比较常见的就是设备的驱动程序,此层没有特定的协议 网络接口层又分为物理层和数据链路层

  • 为数据端设备提供传送数据的通路
  • 传输数据
    • 激活物理连接,在连接的设备之间连接起来形成通路
    • 传输数据,关心如何打包数据和控制传输速度
    • 关闭物理连接
    • 传输方式
  • 数据传输格式
    • 非归零编码 用高低电平来表示
      • 优点 编译简单
      • 缺点 内部不含有时钟信号 无法区分准确信号 收发端同步困难 用象限表示 只能是21象限 或者 34象限的移动 水平移动 无法区分段与段
    • 曼切斯特编码
      • 优点 内部有时钟信号 收发端同步简单
      • 缺点 编译复杂 是非归零编码的两倍 用象限标识 只能是 24象限 或者 13象限 电波移动是在区间内有规律的 可区分段 用于以太网(局域网)

数据链路层

数据链路层们于物理层和互联网层之间,用来向网络层提供数据,就是把源计算机网络层传过来的信息传递给目标主机。

  • 基本作用
    • 如何将数据组合成数据帧(Frame),帧是数据链路层的传输单位
    • 数据链路的建立、维护和拆除
    • 帧包装、帧传输、帧同步
    • 帧的差错恢复
    • 流量控制
  • 以太网
    • 以太网是一种计算机局域网技术 他规定了包括物理层的连线 电子信号和介质访问层的协议内容
    • 标准拓扑结构为总线型拓扑 CSMA/CD 既载波多重访问/碰撞侦测 的总线技术
    • 实现了网络上无线电系统多个节点发送消息的想法,每个节点必须获取电缆或者通信通道才能传到消息
    • 每一个节点都拥有一个全局唯一的网卡MAC地址 以保证以太网上所有节点可以相互鉴别
  • 总线型拓扑
    • 是采用单根传输作为共用的传输介质,将网络中所有的计算机通过相应的硬件接口和电缆直接连接到这根共享的总线上
    • 类似于一个广播电台 任何人进入这个电台都能听到所有人的消息 不安全
    • 交换机解决了不安全的问题
  • 载波多重访问/碰撞侦测
    • 是一种允许多个设备在同一信道发送信号的协议,其中的设备监听其它设备是否忙碌,只有在线路空闲时才发送 比方 10个人共用一双鞋 只有鞋没人穿的时候 自己才能穿
    • 冲突检测 退避重传 二进制指数退避重传
    • 多次碰撞,放弃发送,最多16次
  • 以太网帧的格式
    • 前导符 + 帧起始(定位符) + 目标地址 +源地址 + 类型(长度) + IP层数据 + FCS
    • 前导符(Preamble) 由1和0交互构成(10101010…..),共占7个字节,用于使PLS子层电路与收到的帧达成时钟同步
    • 帧起始 为10101011,共占1个字节,表示一个帧的开始。它和前导符共同使接收方能根据1、0交替来迅速实现比特同步,当检测到连续的两位1时,将后续信息交给MAC子层。通常来说,Pre和SFD这两个字段只用于提醒接收端新帧到达,并不计入MAC帧大小,也不算作是MAC帧头的组成部分
    • 目标地址 源地址 分别用于标识目的MAC地址和源MAC地址,两个字段各占6个字节。它们可以是单播地址也可以是广播地址。当地址的最高位为0时表示单播,最高位为1时为组播,全为1时为广播
    • 类型(长度) 共占2个字节,对于不同的网络协议,它有不同的含义。但是,作为类型使用时,最小值也总是大于1536(十六进制0x600);所以不会产生冲突。另外,在IEEE 802.3中,数据字段的长度为38~1500个字节
    • 帧校验序列(FCS) 它是一个包含32位CRC校验值的字段,一共占4个字节。由发送端对MAC帧的DA字段到Data字段间(不包含前导符和帧起始)的二进制序列进行计算
  • ARP
    • 总线型拓扑概念 广播电台

    • 地址解析协议 通过IP找到对应的MAC地址的一个TCP/IP协议

    • 主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源

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

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

    • ARP协议报文

      • 以太网目的地址
      • 以太网源地址
      • 帧类型 这三个是以太网首部

      这是28字节ARP请求/应答

      • 硬件类型 表示硬件地址的类型,值为1表示以太网地址
      • 协议类型 表示要映射的协议地址类型。它的值为0x0800表示IP地址类型
      • 硬件地址长度 以字节为单位,对于以太网上的IP地址的ARP请求或应答来说,他们的值分别为6和4
      • 协议地址长度 以字节为单位,对于以太网上的IP地址的ARP请求或应答来说,他们的值分别为6和4
      • op 用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4
      • 发送端以太网地址 发送方设备的硬件地址
      • 发送端IP地址 发送方设备的IP地址
      • 目标以太网地址 接收方设备的硬件地址
      • 目标IP地址 接收方设备的IP地址
  • MAC地址
    • 在通信过程中是用内置在网卡内的地址来标识计算机身份的
    • 每个网卡都有一个全球唯一的地址来标识自己,不会重复
    • MAC地址48位的二进制组成,通常分为6段,用16进制表示
    • 前24bit是供应商的标识码 每个供应商独有 后24bit是供应商对网卡的唯一编号

网络层

位于传输层和网络接口层之间,用于把数据从源主机经过若干个中间节点传送到目标主机,并向传输层提供最基础的数据传输服务,它要提供路由和选址的工作

  • 选址
    • 交换机是靠MAC来寻址的,而因为MAC地址是无层次的,所以要靠IP地址来确认计算机的位置,这就是选址
  • 路由
    • 在能够选择的多条道路之间选择一条最短的路径就是路由的工作
  • IP
    • 在网络中,每台计算机都有一个唯一的地址,方便别人找到它,这个地址称为IP地址。
    • IP头部信息
      • 版本
      • 首部长部
      • 优先级与服务类型(TOS)
        • TOS包括共8位,包括3 bit的优先权字段(取值可以从000-111所有值),4 bit的TOS子字段和1 bit未用位但必须置0。
        • 3bit的8个优先级的定义如下:
          • 111--Network Control(网络控制)一般保留给网络控制数据使用,如路由。
          • 110--Internetwork Control(网间控制)
          • 101--Critic(关键)语音数据使用。
          • 100--Flash Override(疾速)视频会议和视频流使用。
          • 011--Flash(闪速)语音控制数据使用。
          • 010--Immediate(快速)数据业务使用
          • 001--Priority(优先)数据业务使用
          • 000--Routine(普通)默认标记值。
        • 4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。
        • Telnet、Rlogin这两个交互应用要求最小的传输时延,FTP文件传输要求最大吞吐量,最高可靠性是指网络管理(SNMP)和路由选择协议。用户网络新闻要求最小费用
      • 总长度 该字段用以指示整个IP数据包的长度,最长为65535字节,包括头和数据
      • 标识符 唯一标识主机发送的每一份数据报
      • 标志 分为3个字段,依次为保留位、不分片位和更多片位
        • 保留位:一般被置为0
        • 不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0
        • 更多片位:除了最后一个分片,其他每个组成数据报的片都要将该位置设置为1.
      • 段偏移量 该分片相对于原始数据报开始处位置的偏移量
      • TTL(Time to Live生存时间) 该字段用于表示IP数据包的生命周期,可以防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃之前在网络中的最大周转时间。该数据包经过的每一个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包通过路由器的数目,一个数据包每经过一个路由器,TTL将减去1。
      • 协议号 用以指示IP数据包中封装的是哪个协议
      • 首部校验和 检验和是16位的错误检测字段。目的主机和网络中的每个网关都要重新计算报头的校验和,一样表示没有改动过.
      • 源IP地址 该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址
      • 目标IP地址 该字段用于表示数据包的目标的地址,指的是接收节点的网络地址
      • IP头部信息
      • IP地址格式
        • IP地址是一个网络编码,用来确定网络中的一个节点。
        • IP地址是由32位二进制(32bit)组成
      • IP地址组成
        • 网络部分(NETWORK) 标识不同的网络
        • 主机部分(HOST) 标识同一个网络下不同的主机
        • ip地址标识
      • IP地址分类
        • IP地址的网络部分是由Internet地址分配机构来统一分配的,这样可以保证IP的唯一性。
        • ip地址中全为1的ip即255.255.255.255,它称为限制广播地址,如果将其作为数据包的目标地址可以理解为发送到所有网络的所有主机
        • ip地址中全为0的ip即0.0.0.0,它表示启动时的ip地址,其含义就是尚未未分配时的ip地址
        • 127是用来进行本机测试的,除了127.255.255.255外,其它的127开头的地址都代表本机
        • ip分类
        • A类IP 由1组netWork和3组Host组成 100.0.0.0 - 100.255.255.255 最大主机数为 2**24 -2
        • B类IP 由2组netWork和3组Host组成 100.100.0.0 - 100.100.255.255 最大主机数为 2**16 -2
        • C类IP 由3组netWork和3组Host组成 100.100.1000.0 - 100.100.100.255 最大主机数为 2**8 -2
      • 私有地址和共有地址
        • A类私有IP 10.0.0.0 - 10.255.255.255
        • B类私有IP 172.16.0.0 - 172.31.255.255
        • C类私有IP 192.168.0.0 - 192.168.255.255
        • 每一类除了私有ip都是公有ip
      • 子网掩码
        • 解决的问题 IP不够用 同一子网下的IP是用的一个
        • 子网掩码(subnet mask)又叫子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机位的掩码。
        • 子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分
        • 子网掩码也是32个二进制位
        • 对应IP的网络部分用1表示
        • 对应IP地址的主机部分用0表示
        • IP地址和子网掩码做逻辑与运算得到网络地址
          • 0和任何数相与都是0
          • 1和任何数相与都等于任何数本身
        • A B C 三类地址都有自己默认的子网掩码
          • A类 255.0.0.0
          • B类 255.255.0.0
          • C类 255.255.255.0
          let ip1 = '192.168.0.1';
          let ip2 = '192.168.0.4';
          let mask = '255.255.255.0';
          let ip1s = ip1.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');
          let ip2s = ip2.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');;
          let masks = mask.split('.').map(item=>(+item).toString(2).padStart(8,'0')).join('');
          
          console.log(ip1s,parseInt(ip1s,2),parseInt(masks,2),parseInt(ip1s,2)&parseInt(masks,2));
          console.log(ip2s,parseInt(ip2s,2),parseInt(masks,2),parseInt(ip2s,2)&parseInt(masks,2));
          console.log((parseInt(ip1s,2)&parseInt(masks,2)) === (parseInt(ip2s,2)&parseInt(masks,2)));
          

传输层

  • 位于应用层和网络接口层之间
    • 是面向连接的、可靠的的进程到进程通信的协议
    • TCP提供全双工服务,即数据可在同一时间双向传播
    • TCP将若干个字节构成一个分组,此分组称为报文段(Segment)
  • 传输层功能
    • 提供了一种端到端的连接
  • 对可靠性要求高的上层协议,实现可靠性的保证
    • 如果数据丢失、损坏的情况下如何保证可靠性
    • 网络层只管传递数据,成功与否并不关心
  • 协议分类
    • TCP(Transimision Control Protocal)
      • 传输控制协议
      • 可靠的、面向连接的协议
      • 传输效率低
    • UDP(User Datagram Protocal)
      • 用户数据报协议
      • 不可靠的、无连接的服务
      • 传输效率高
TCP
  • TCP功能
    • 将数据进行分段打包传输
    • 对每个数据包编号控制顺序
    • 运输中丢失、重发和丢弃处理
    • 流量控制避免拥塞
  • TCP数据包解析
    • 源端口号和目标端口号,计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪个程序来接收
    • 32位序列号 TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值
    • 确认应答号 它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。
    • 首部长度:TCP 首部的长度,单位为 4 字节。如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节
    • 控制位 TCP的连接、传输和断开都受这六个控制位的指挥
      • PSH(push急迫位) 缓存区将满,立刻传输速度
      • RST(reset重置位) 连接断了重新连接
      • URG(urgent紧急位) 紧急信号
    • 紧急指针:尽在 URG(urgent紧急) 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)。
    • ACK(acknowledgement 确认)为1表示确认号
    • SYN(synchronous建立联机) 同步序号位 TCP建立连接时要将这个值设为1
    • FIN发送端完成位,提出断开连接的一方把FIN置为1表示要断开连接
    • 窗口值 说明本地可接收数据段的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的
    • 窗口大小:用于表示从应答号开始能够接受多少个 8 位字节。如果窗口大小为 0,可以发送窗口探测。
    • 用来做差错控制,TCP校验和的计算包括TCP首部、数据和其它填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次检验和计算。如果两次校验 和一致说明数据是正确的,否则 将认为数据被破坏,接收端将丢弃该数据
    • tcp头信息
  • 握手和断开
    • TCP是面向连接的协议,它在源点和终点之间建立虚拟连接,而不是物理连接
    • 在数据通信之前,发送端与接收端要先建立连接,等数据发送结束后,双方再断开连接
    • TCP连接的每一方都是由一个IP地址和一个端口组成
  • 三次握手
    • 第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号
    • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。
    • 第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。
  • 四次挥手
    • 主机A发送FIN控制位发出断开连接的请求
    • 主机B进行响应,确认收到断开连接请求
    • 主机B提出反方向的关闭要求
    • 主机A确认收到的主机B的关闭连接请求
  • 三握四挥流程图
  • 滑动窗口
    • 根据带宽大小 来计算滑动窗口的大小
    • 滑动窗口(Sliding window)是一种流量控制技术
    • 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题
    • TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据
    • 当滑动窗口为0时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小
  • 窗口机制
    • 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口
    • 发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同
    • 不同的滑动窗口协议窗口大小一般不同
    • 发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧
  • 拥塞控制 (超时快恢复 不会回到1重新开始 而是阈值的一半)
    • 在根据带宽来计算流量大小是 为了确保能最大程度是使用带宽 会采取从0逐渐递增的方式来寻找带宽的阈值
    • 而超过阈值之后 会除以2来退位
    • TCP拥塞控制是传输控制协议(英语:Transmission Control Protocol,缩写TCP)避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施
    • TCP使用多种拥塞控制策略来避免雪崩式拥塞。TCP会为每条连接维护一个“拥塞窗口”来限制可能在端对端间传输的未确认分组总数量
    • 这类似TCP流量控制机制中使用的滑动窗口,是由发送方控制的
    • TCP在一个连接初始化或超时后使用一种“慢启动”机制来增加拥塞窗口的大小。它的起始值一般为最大分段大小(Maximum segment size,MSS)的两倍,虽然名为“慢启动”,初始值也相当低,但其增长极快:当每个分段得到确认时,拥塞窗口会增加一个MSS,使得在每次往返时间(round-trip time,RTT)内拥塞窗口能高效地双倍增长
    • 在流量控制中,接收方通过TCP的“窗口”值(Window Size)来告知发送方,由发送方通过对拥塞窗口和接收窗口的大小比较,来确定任何时刻内需要传输的数据量
    • 和式增加,积式减少(additive-increase/multiplicative-decrease,AIMD,这里简称“线增积减”)是一种反馈控制算法,其包含了对拥塞窗口线性增加,和当发生拥塞时对窗口积式减少。多个使用AIMD控制的TCP流最终会收敛到对线路的等量竞争使用。
    • 未确认的数据包刚好等于带宽等于延迟
    • 当发现丢包的时候立刻减半
  • 粘包
    • 默认nagle算法 由于速度太快 就算传递的字节很小 都会携带20k的请求头去请求 20k的头+1k的内容 消耗性能
    • cork算法 粘包 等到传递的内容达到一定的字节之后再开始发送
UDP
  • UDP是一个无连接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉 发送方是否收到了数据,它的可靠性由上层协议来保障 首部结构简单,在数据传输时能实现最小的开销,如果进程想发送很短的报文而对可靠性要求不高可以使用
  • UDP的封装格式
    • UDP头信息
  • UDP的应用场景
    • QQ
    • 视频软件
    • TFTP 简单文件传输协议(短信)
  • UDP服务器
    • 点到点
      • udp_server.js
      
      var dgram = require('dgram');
      var socket = dgram.createSocket('udp4');
      socket.on('message',function(msg,rinfo){
      console.log(msg.toString());
      console.log(rinfo);
      socket.send(msg,0,msg.length,rinfo.port,rinfo.address);
      });
      socket.bind(41234,'localhost');
      
      • udp_client.js
      var dgram = require('dgram');
      var socket = dgram.createSocket('udp4');
      socket.on('message',function(msg,rinfo){
          console.log(msg.toString());
          console.log(rinfo);
      });
      socket.send(new Buffer('helloworld'),0,5,41234,'localhost',function(err,bytes){
          console.log('发送了个%d字节',bytes);
      });
      socket.on('error',function(err){
          console.error(err);
      });
      
      
      • 广播

        • 创建一个UDP服务器并通过该服务器进行数据的广播
        • udp_server.js
        
        let dgram = require('dgram');
        let server = dgram.createSocket('udp4);
        server.on('message',function(msg){
        let buf = new Bufffer('已经接收客户端发送的数据'+msg);
        server.setBroadcast(true);
        server.send(buf,0,buf.length,41235,"192.168.1.255");
        });
        server.bind(41234,'192.168.1.100');
        
        • udp_client.js
        let dgram = require('dgram');
        let client = dgram.createSocket('udp4);
        client.bind(41235,'192.168.1.102);
        let buf = new Buffer('hello');
        client.send(buf,0,buf.length,41234,'192.168.1.100');
        client.on('message',function(msg,rinfo){
        console.log('received : ',msg);
        });
        
        
      • 组播

        • 所谓的组播,就是将网络中同一业务类型进行逻辑上的分组,从某个socket端口上发送的数据只能被该组中的其他主机所接收,不被组外的任何主机接收。
        • 实现组播时,并不直接把数据发送给目标地址,而是将数据发送到组播主机,操作系统将把该数据组播给组内的其他所有成员。
        • 在网络中,使用D类地址作为组播地址。范围是指 224.0.0.0 ~ 239.255.255.255,分为三类
          • 局部组播地址: 224.0.0.0 ~ 224.0.0.255 为路由协议和其他用途保留
          • 预留组播地址: 224.0.1.0 ~ 238.255.255.255 可用于全球范围或网络协议
          • 管理权限组播地址 : 239.0.0.0 ~ 239.255.255.255 组织内部使用,不可用于Internet
        • udp_server.js
        let dgram = require('dgram');
        let server = dgram.createSocket('udp4');
        server.on('listening',function(){
        server.MulticastTTL(128);
        server.setMulticastLoopback(true);
        server.addMembership('230.185.192.108');
        });
        setInterval(broadcast,1000);
        function broadcast(){
        let buffer = Buffer.from(new Date().toLocaleString());
        server.send(buffer,0,buffer.length,8080,"230.185.192.108");
        }
        
        • udp_client.js
        let dgram = require('dgram');
        let client = dgram.createSocket('udp4');
        client.on('listening',function(){
        client.addMembership('230.185.192.108');
        });
        client.on('message',function(message,remote){
        console.log(message.toString());
        });
        client.bind(8080,'192.168.1.103');
        
        
DHCP服务器
  • 保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。
  • DHCP应当可以给用户分配永久固定的IP地址。
  • DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)
  • DHCP服务器应当向现有的BOOTP客户端提供服务。

主机发送DHCPDISCOVER广播包在网络上寻找DHCP服务器; DHCP服务器向主机发送DHCPOFFER单播数据包,包含IP地址、MAC地址、域名信息以及地址租期; 主机发送DHCPREQUEST广播包,正式向服务器请求分配已提供的IP地址; DHCP服务器向主机发送DHCPACK单播包,确认主机的请求

  • DHCP的租聘时间大约10小时
  • 路由器 兼备 路由 网关 DHCP服务器的功能

应用层

  • 发送方是从高层到低层封装数据

    • 在应用层要把各式各样的数据如字母、数字、汉字、图片等转换成二进制
    • 在TCP传输层中,上层的数据被分割成小的数据段,并为每个分段后的数据封装TCP报文头部
    • 在TCP头部有一个关键的字段信息端口号,它用于标识上层的协议或应用程序,确保上层数据的正常通信
    • 计算机可以多进程并发运行,例如在发邮件的同时也可以通过浏览器浏览网页,这两种应用通过端口号进行区分
    • 在网络层,上层数据被封装上亲的报文头部(IP头部),上层的数据是包括TCP头部的。IP地址包括的最关键字段信息就是IP地址,用于标识网络的逻辑地址。
    • 数据链路径层,上层数据成一个MAC头部,内部有最关键的是MAC地址。MAC地址就是固化在硬件设备内部的全球唯一的物理地址。
    • 在物理层,无论在之前哪一层封装的报文头和还是上层数据都是由二进制组成的,物理将这些二进制数字比特流转换成电信号在网络中传输
    • 封装数据
  • 接收方是从低层到高层解封装

    • 数据封装完毕传输到接收方后,将数据要进行解封装
    • 在物理层,先把电信号转成二进制数据,并将数据传送至数据链路层
    • 在数据链路层,把MAC头部拆掉,并将剩余的数据传送至上一层
    • 在网络层,数据的IP头部被拆掉,并将剩余的数据送至上一层
    • 在传输层,把TCP头部拆掉,将真实的数据传送至应用层
    • 解封数据
  • 网络环境

    • 数据流程图

三握四挥

  • 三次握手的顺序
    • client connect() 向Server建立连接 SYN seq = 0 0是一个相对值
    • Server listen() 收到之后 给Client返回 SYN sep =0 0是一个相对值 ACK = 0+1 ACK的值是client给Server的SYN的值+1
    • client 给Server发送一个 ACK = 0+1 ACK的值是server给client的SYN的值+1
  • 数据传输阶段
    • 客户端 write() 会发送 seq = x+1 ack = y+1
    • 服务端 read() 发送 ACK+2
    • 每进行一次传输 都会发送一组这样的请求
  • 四次挥手顺序
    • 客户端 close() 发送 FIN seq = x+2 ACK = Y+1 我要和你分手
    • 服务端 ACKx+3 我知道这条消息了 如果没有这条消息 客户端会一直给服务端发分手请求
    • 服务端 FIN seq = Y+1 我同意跟你分手
    • 客户端 ACK = Y+2 OK
  • 三握四挥流程图