MAC 头部、IPv4 头部、IPv6 头部、TCP 头部和 UDP 头部

server/2024/12/17 5:43:48/

MAC 头部

字段名称长度(字节)描述
目标 MAC 地址6接收设备的 MAC 地址。
源 MAC 地址6发送设备的 MAC 地址。
以太网类型/长度2表示上层协议类型(如 IPv4、IPv6)或数据长度(以太网 II 或 802.3)。
数据负载46-1500上层协议封装的数据,长度 46~1500 字节。
帧校验序列(FCS)4CRC32 校验,用于检测帧传输中的错误。

 

IPv4 头部

字段名称长度(位)描述
版本号4指定 IP 协议版本,IPv4 的值为 4。
首部长度4指定 IP 首部的长度(以 4 字节为单位)。
服务类型(TOS)8指示服务质量(如低延迟、高吞吐量)。
总长度16表示整个数据包的长度,包括头和数据。
标识16用于区分不同的分片。
标志3控制分片行为,如“更多分片”标志(MF)。
片偏移13分片数据在原数据包中的偏移量。
生存时间(TTL)8表示数据包在网络中生存的最大跳数。
协议8指示上层协议类型(如 6 表示 TCP,17 表示 UDP)。
头校验和16对 IP 头进行校验,确保数据完整性。
源 IP 地址32表示发送方的 IP 地址。
目的 IP 地址32表示接收方的 IP 地址。
选项(可选部分)可变用于扩展功能,如安全性和时间戳。
数据部分可变上层协议的数据。

IPv6 头部

字段名称长度(位)描述
版本号4指定 IP 协议版本,IPv6 的值为 6。
流量类别8指示数据包的服务类型和优先级。
流标识20用于标识数据流,支持 QoS(服务质量)。
有效载荷长度16数据部分的长度(不包括头部)。
下一个头部8指示上层协议(如 TCP:6,UDP:17,ICMPv6:58)。
跳限制(Hop Limit)8数据包可经过的最大路由跳数,类似 IPv4 的 TTL。
源地址128发送方的 IPv6 地址。
目的地址128接收方的 IPv6 地址。
扩展头部(可选)可变包括路由头、分片头、认证头等。
数据部分可变封装的传输层协议数据。

TCP 头部

字段名称长度(位)描述
源端口号16发送方的端口号。
目的端口号16接收方的端口号。
序列号32数据流中第一个字节的编号。
确认号32表示期望接收的下一个字节序号。
数据偏移4TCP 头的长度(以 4 字节为单位)。
保留位6保留字段,目前未使用。
控制位6标志位,用于连接和数据流控制(如 SYN、ACK、FIN 等)。
窗口大小16用于流量控制,表示接收方可接收的数据量。
校验和16检测头部和数据部分是否完整。
紧急指针16紧急数据的位置,仅在 URG 标志位置位时有效。
选项可变包括 MSS(最大报文段大小)等扩展功能。
数据部分可变封装的应用层数据。

UDP 头部

字段名称长度(位)描述
源端口号16发送方的端口号。
目的端口号16接收方的端口号。
长度16整个 UDP 数据报的长度,包括头部和数据部分。
校验和16用于检测数据报是否完整。
数据部分可变封装的应用层数据。

场景:用户浏览网页的详细过程

1. 用户输入 URL

用户在浏览器中输入 URL(例如 http://www.example.com),并按下回车键。

  • 应用层协议:HTTP
    • 浏览器生成一个 HTTP 请求:
      • 方法:GET
      • URL:http://www.example.com
      • HTTP 版本:HTTP/1.1
      • 其他头部字段(如 User-Agent、Host)。
    • 目标是从服务器获取网页内容。

2. DNS 查询

为了知道 www.example.com 对应的服务器 IP 地址,浏览器首先发起 DNS 查询

  • 应用层:DNS 请求

    • 浏览器检查本地 DNS 缓存。如果没有找到 IP 地址,则构造一个 DNS 查询报文。
    • 查询目标为 www.example.com 的 IP 地址。
  • 传输层:UDP 协议

    • DNS 查询被封装在 UDP 数据段中。
    • UDP 头部包含:
      • 源端口号:随机分配(例如 51000)。
      • 目标端口号:53(DNS 服务器的标准端口)。
  • 网络层:IPv4/IPv6

    • UDP 数据段被封装在 IP 数据包中。
    • IP 头部包含:
      • 源 IP 地址:用户设备的 IP 地址(如 192.168.1.100)。
      • 目标 IP 地址:DNS 服务器的 IP 地址。
  • 链路层:以太网帧

    • IP 数据包被封装在以太网帧中。
    • MAC 头部包含:
      • 源 MAC 地址:用户设备的 MAC 地址。
      • 目标 MAC 地址:路由器的 MAC 地址(下一跳)。
  • DNS 响应

    • DNS 服务器返回 www.example.com 的 IP 地址(如 93.184.216.34),使用类似的封装方式。

 

3. 建立 TCP 连接

得到服务器的 IP 地址后,浏览器与 93.184.216.34 建立 TCP 连接

(1) 三次握手过程
  • 第一次握手:SYN

    • 客户端生成一个 TCP SYN 包,请求建立连接。
    • TCP 头部:
      • 标志位:SYN=1,ACK=0。
      • 序列号:随机生成(如 1000)。
    • IP 头部:
      • 源 IP 地址:192.168.1.100
      • 目标 IP 地址:93.184.216.34
    • MAC 头部:
      • 源 MAC 地址:用户设备的 MAC 地址。
      • 目标 MAC 地址:路由器的 MAC 地址(或下一跳设备)。
  • 第二次握手:SYN-ACK

    • 服务器响应 TCP SYN 包,返回 SYN-ACK。
    • TCP 头部:
      • 标志位:SYN=1,ACK=1。
      • 序列号:随机生成(如 3000)。
      • 确认号:客户端序列号 + 1(即 1001)。
  • 第三次握手:ACK

    • 客户端发送 ACK 包,确认连接已建立。
    • TCP 头部:
      • 标志位:ACK=1。
      • 确认号:服务器序列号 + 1(即 3001)。

4. 发送 HTTP 请求

TCP 连接建立后,浏览器通过 HTTP 协议 向服务器发送网页请求。

  • HTTP 请求内容

    • GET /index.html HTTP/1.1
    • Host: www.example.com
  • 封装过程

    • 传输层:TCP
      • HTTP 数据被封装在 TCP 数据段中。
      • TCP 头部:
        • 源端口号:随机分配(如 51001)。
        • 目标端口号:80(HTTP 的标准端口)。
    • 网络层:IP
      • TCP 数据段被封装在 IP 数据包中。
      • IP 头部:
        • 源 IP 地址:用户设备的 IP 地址。
        • 目标 IP 地址:服务器的 IP 地址。
    • 链路层:以太网
      • IP 数据包被封装在以太网帧中。
      • MAC 头部:
        • 源 MAC 地址:用户设备的 MAC 地址。
        • 目标 MAC 地址:路由器的 MAC 地址。

5. 服务器响应

服务器接收到 HTTP 请求后,处理并返回网页内容。

  • HTTP 响应内容

    • HTTP/1.1 200 OK
    • Content-Type: text/html
    • 网页的 HTML 数据。
  • 封装过程

    • 传输层:TCP
      • HTTP 响应数据被封装在 TCP 数据段中。
      • TCP 头部:
        • 源端口号:80。
        • 目标端口号:51001(客户端的端口)。
    • 网络层:IP
      • TCP 数据段被封装在 IP 数据包中。
      • IP 头部:
        • 源 IP 地址:服务器的 IP 地址。
        • 目标 IP 地址:客户端的 IP 地址。
    • 链路层:以太网
      • IP 数据包被封装在以太网帧中。
      • MAC 头部:
        • 源 MAC 地址:服务器的 MAC 地址。
        • 目标 MAC 地址:下一跳路由器的 MAC 地址。

 

6. 浏览器解析网页

  • 浏览器收到服务器返回的 HTTP 响应后,解封装数据:

    • 链路层: 检查 MAC 地址,确认帧是给自己的,移除 MAC 头。
    • 网络层: 检查 IP 地址,确认包是给自己的,移除 IP 头。
    • 传输层: 检查 TCP 序列号和确认号,按序重组数据,移除 TCP 头。
    • 应用层: 提取 HTTP 数据(网页内容)。
  • 浏览器根据 HTML 内容渲染网页,并显示给用户。

7. 释放连接

当网页加载完成,浏览器和服务器通过 TCP 四次挥手 释放连接。

四次挥手过程
  1. 客户端发送 FIN 包:
    • 表示客户端关闭数据发送。
    • TCP 头部:FIN=1,ACK=1。
  2. 服务器回复 ACK 包:
    • 表示已接收关闭请求。
    • TCP 头部:ACK=1。
  3. 服务器发送 FIN 包:
    • 表示服务器关闭数据发送。
    • TCP 头部:FIN=1,ACK=1。
  4. 客户端回复 ACK 包:
    • 表示已接收服务器的关闭请求。
    • TCP 头部:ACK=1。

http://www.ppmy.cn/server/150812.html

相关文章

云计算:开启数字化变革的强大引擎

一、云计算的基本概念 定义与内涵 云计算是一种基于互联网的计算模式,通过网络将大量的计算资源(如服务器、存储、应用软件、服务等)进行整合,以服务的形式提供给用户。它实现了资源的虚拟化,使得用户无需直接管理和维…

Kubernetes和ZStack分配CPU的机制

在 Kubernetes (k8s) 环境中限制 CPU 资源与在 ZStack 虚拟机中分配 CPU 资源的机制存在一些关键差异。以下是这两种环境下 CPU 分配机制的详细对比: Kubernetes 中的 CPU 管理 资源请求与限制:Kubernetes 允许你为每个容器指定 CPU 请求(re…

webrtc学习----前端推流拉流,局域网socket版,一对多

提示:局域网socket版,一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 ‌‌‌‌‌WebRTC(Web Real-Time Communication)‌是一种实时通讯技术&#x…

rabbitmq问题,消费者执行时间太长,超过心跳时间,消费者消失,任务堆积

rabbitmq问题,消费者执行时间太长,超过心跳时间,消费者消失,任务堆积 1.python多线程使用rabbitmq包地址 flask_rabbitmq 2.解决后的包 import json import logging import signal import sys import threading import time i…

Uniapp安卓端获取手机号码

简述 简单的讲就是可以使用uniapp调取原生的安卓的接口来获取对应的手机号码信息 准备工作 下面是要开启的获取手机号的的必要信息转变准备 然后就是开启应用权限管理的号码权限(一般都会开启) 获取主手机号 onLoad() {plus.android.importClass(an…

Scala的trait

//定义trait //1.不是类:不能实例化 //2.它的构造器不能带参数! 即:不能添加()trait Shentihao{//具体属性var KM_i 5//抽象属性var sports:String//具体方法def say(): Unit {}//抽象方法def run } class Student e…

OpenCV--特征匹配

OpenCV--特征匹配 代码和笔记 代码和笔记 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配:使用第一组(第一幅图)中的一个特征描述子,使用一些距离计算与第二组中…

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…