重读TCP/IP协议(1)--网络概述

本文深入讲解了TCP/IP协议的工作原理,包括网络分层、数据封装与解封装过程,并通过一个客户端-服务器模型的实际案例,详细阐述了数据在网络中的传输流程。

以前很多不同的厂家生产各自的计算机,有着不同的操作系统,只有同样的操作系统的计算机才能通信,但TCP/IP允许这些不同的操作系统的计算机互相进行通信,他们都准守则一些协议在网络中进行传输,这些守则被称之为TCP/IP协议。

网络分层

由于TCP/IP协议比较复杂,所以我们一般把TCP/IP协议通过分层来进行讨论,每一层负责不同的通信功能,每一层的开发都是独立的,无需关心另外一层,TCP/IP通常分为四层,OSI把网络通常分为7层,本质上是一样的,只是OSI七层模型分的更细而已。

TCP/IP四层

应用层:负责特定的应用程序细节,如FTP HTTP, TELNET

运输层:为应用程序提供端到端的通信,TCP, UDP传输

网络层:IP选路,IP包,ICMP, IGMP及路由器相关

链路层:设备驱动程序和网卡及以太网,交换机相关

一般来说顶层应用层关心的是程序的细节,如FTPlogin/dir/mget/等,不会关心下三层这个数据如何在网络中传输,用TCP还是UDP,如何在路由器中选路,如何获取接收端的MAC地址从而正确无误的传达到目的端,这些在应用层是不关心的,同理下三层主要关心的是数据在网络中的传输过程,如何可靠,如何快速到达等细节,而对应用程序却一无所知,下三层不关心你是HTTP还是FTP,它都把这些当做是数据封装在数据里,下三层考虑的是如何增加数据头,以使得他们在网络中进行正确的传输。互联网的目的之一就是在应用程序中隐藏掉所有的物理细节,应用层不会关心也不能关心是在以太网中传输还是在令牌环上传输,这样应用开发人员只要开发好的应用,而网络工程师则设计最好的,最快的,最适合的网络

应用层:应用程序细节

表示层:数据的表示,如jpeg, ascII, 加密格式

会话层:建立,管理,终止会话

传输层:定义端口,及流控,TCP/UDP

网络层:  IP选路,逻辑寻址

链路层:硬件地址选址,差错检验

物理层:物理电缆,光纤等传输媒介

数据封装

之前说过,数据在网络中传输需要经过数据链路层,网络层,传输层,这其实是一个封装的过程,一个应用程序加上应用程序头,如我们浏览一个html网页,看到了新浪首页,里面有图片,有文字,我们统称为数据,在这些数据前面加上Http头,如版本信息等,应用层数据被分成TCP分段,各分段被打上标签,在传输层传输,传输层把http_head+data看作一个整体,统一加上tcp_headTCP分段发送到网络层,网络层把tcp_head+http_head+data看作一个整体,统一加上ip_head封装成IP数据报文,之后发送到接入层,把ip_head+tcp_head+http_head+data看作一个整体,统一加上ethernet_head成为以太网帧,最后通过网线或光纤到达接收主机,这个封装过程我们一般把应用程序称之为数据,为了能够更好的传输,我们通常会把大数据进行分片,提高传输的可靠性,即使有一些片断丢失了,只需要重传这一部分就好,而无需全部重传,这个分段发生在传输层,称之为segment, TCP分段后在IP层进行传输,我们称之为IP数据报,最后增加以太网首部后,整个数据我们称之为以太网帧,如下图

解封装

接收主机以相反的方式进行解封装,接收端收到的是ethernet_head+ip_head+tcp_head+http_head+data,把头部一层一层的剥去,最终留下data给浏览器展现在客户面前的是新浪的首页

C/S模型

网络中最经典的模型就是客户端服务器模式,目的是使服务器为客户端提供一些特定的服务,纸上得来终觉浅,觉知此事需躬行,最后以一个经典的http案例来解释网络传输的过程,由于只是综述,并不打算展开细讲,所以直接取局域网内的两台PC作实验,免去IP路由这一块。

Web Server:

         IP:           192.168.2.111:8000

         MAC:        b4:6d:83:92:63:69

Web Client:

         IP:           192.168.2.101

         MAC:        00:26:c6:c9:ad:74IntelCor_c9:ad:74

Step1 找人:

Web Client想与 Web Server进行通信,首先他得找到Web Server,这是一个通过IP地址寻找MAC地址的过程,client知道网址http://192.168.2.111:8000/blog,但它并不知道是哪台服务器,此时它首先产生一个ARP的过程,通过IP寻找MAC的过程


Client首先广播一个数据帧询问本网谁的IP地址是192.168.2.111

Server接到该广播后发现找的是自己,于是单播回给client,你要找的是我,并把自己的MAC地址告诉client,这样client就可以与server进行通信了,ARP工作在二层,所以目前只有一个以太网头,没有IP

Step2 建立连系


ClientServer通过三次握手建立连接,协商TCP分段大小,确认对端可靠,TCP的三次连接指的是client发一个syncServer并带上自己的client_seq

Server收到sync后,回一个ack, ack=client_seq+1,并发送syncclient附上server_seq值,以期望得到client的确认

Clinet收到Serversync后,回一个ack=server_seq+1进行确认

TCP三次连接此时数据封装在tcp层, Ethernet_head+ip_head+tcp_head+data(tcp_segment)

Step3 获取页面


Client发出一个get信息想获取blog主页,这个信息的tcp_len=363

Server接收到Client的消息后进行ack确认,ack=client_seq+tcp_len=1+363=364

Server回一个http 200表示http过程OK

Server开始传送主页的数据,由于主页html数据太大,需要进行分段传输,Server首先发了一个分段数据,Client确认后,Server继续发送,直到数据发完后,进行结束确认

前面介绍的是数据包,可以看到的都是封装后的包,而如何封装,如何解封装在抓包中是看不到的,但在逻辑层面是存在分层,是通过主机或者设备的协议栈中进行封装的,封装的过程说白了就是对数据加头部和尾部的过程,整个头部和数据,尾部一起统称为协议数据单元(PDU)发送的过程就是沿着OSI参考模型向下流动,不断的加数据头,PDU逐渐变长,各层协议均将其头部信息添加进去,直到物理层进行传输,发送给目标主机,而接收端通过协议栈不断的剥去协议头部,最终只剩下原始的数据,这就是解封装的过程

     


Client在计算机上浏览http://192.168.2.111:8000/blog
Client需要从服务器上下载一个index.html的文件
Client把请求的数据沿着协议栈传给传输层,由于HTTP是基于TCP的,因此在传输层将创建TCP头部来封装HTTP数据
TCP是架构在IP之上的,为了能够在网络中传输,协议栈又把TCP看作一个整体,创建IP头部进行封装,以明确目的IP,进行逻辑寻址,发送数据到以太网上
以太网给IP数据创建以太网头部,明确发送的接收主机是谁
当数据已经完全封装好后,传递给物理层,此时数据包变成0,1信号通过网络进行传输
封装好的数据通过网线到达服务器,服务器开始读取数据,从下往上,先读以太网数据帧,确认以太网头部发的是不是自己,处理好后,剥去,再读取IP头部,确认数据包正确转发,处理好后剥去,再确认TCP头部,确保数据按序到达,随后剥去,留下原始HTTP数据,分析应用层中的内容,返回HTTP 200表明OK,发送端等待服务器发送index.html页面数据

总结:

这篇文章主要讲的是网络分层,数据封装,这些都是在实际抓包过程中看不到,但是却是我们分析数据的基础,最后以一个经典的C/S,client取server页面的实验来讨论封装,来讨论取数据的过程,但如IP,TCP的头部细节等并不在本文讨论范围

参考:

TCP/IP协议卷一
https://community.emc.com/go/chinese







转载于:https://my.oschina.net/hding/blog/667228

<think>我们正在处理的是Ubuntu虚拟机中LVM逻辑卷(/dev/mapper/ubuntu--vg-ubuntu--lv)空间不足的问题。根据之前的上下文,用户已经通过虚拟机设置扩大了虚拟磁盘的容量,现在需要在操作系统中扩展逻辑卷。 已知:该逻辑卷属于LVM管理,因此我们可以通过LVM命令来扩展。 步骤概述1. 确认虚拟磁盘已扩容(在虚拟机设置中完成,并确保操作系统识别到新的磁盘空间) 2. 创建新分区(如果需要)或者扩展现有物理卷(PV)的分区(如果原来使用的是整个磁盘则无需创建新分区,但需要扩展分区表) 3. 将新空间添加到物理卷(PV) 4. 扩展卷组(VG)(如果新空间已经添加到物理卷,则卷组会自动扩展) 5. 扩展逻辑卷(LV) 6. 扩展文件系统 注意:根据引用[3]和[4],我们可以使用lvextend命令来扩展逻辑卷,然后调整文件系统大小。 具体步骤: 1. 确认磁盘空间已经扩展 在虚拟机中执行: ```bash sudo fdisk -l ``` 查看磁盘(如/dev/sda)的总大小是否已经变为扩容后的大小。 2. 如果原来的物理卷是在一个分区上(例如/dev/sda3),我们需要扩展该分区以占用所有的新空间。如果原来整个磁盘都是物理卷(没有分区),则跳过此步。但通常Ubuntu安装时使用的是分区。 3. 扩展物理卷所在分区(如果必要): 使用`growpart`工具(如果没有则安装`cloud-guest-utils`): ```bash sudo apt install cloud-guest-utils -y sudo growpart /dev/sda 3 # 假设物理卷在/dev/sda3,数字3是分区号 ``` 或者使用`parted`: ```bash sudo parted /dev/sda resizepart 3 100% # 同样,3是分区号 ``` 4. 更新物理卷(PV): ```bash sudo pvresize /dev/sda3 # 假设物理卷在/dev/sda3 ``` 此时,物理卷会使用分区上所有可用的空间。 5. 查看卷组(VG)是否有可用空间: ```bash sudo vgdisplay ``` 在输出中查看“Free PE / Size”一行,确保有可用空间。 6. 扩展逻辑卷(LV): 我们可以将全部空闲空间都分配给逻辑卷: ```bash sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv ``` 或者指定增加的大小,例如增加10G: ```bash sudo lvextend -L +10G /dev/mapper/ubuntu--vg-ubuntu--lv ``` 7. 调整文件系统大小: 根据文件系统类型选择命令: - 对于ext4文件系统: ```bash sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv ``` - 对于xfs文件系统: ```bash sudo xfs_growfs / ``` 注意:如果逻辑卷挂载在根目录,则使用`xfs_growfs /`;如果是其他文件系统类型,请使用对应的命令。 8. 验证: ```bash df -h ``` 查看挂载点的可用空间是否增加。 重要注意事项: - 在执行这些操作前,建议备份重要数据或创建虚拟机快照。 - 确保在操作过程中不要断电或强制关闭虚拟机。 如果步骤2中需要调整分区表,但分区后面没有连续的空间(比如有交换分区等),则需要先调整其他分区(可能需要关闭交换分区并删除交换分区,然后再重建),这会更复杂。但一般情况下,如果虚拟机是刚扩容的,且分区是连续的,那么调整分区大小即可。 根据引用[4]中提到了多种调整LV大小的命令,包括增大、减小和按百分比扩容。 如果用户使用的是VirtualBox虚拟机,并且虚拟磁盘是动态分配的,扩容后可能需要在虚拟机内部执行一次强制磁盘扫描才能识别新空间: ```bash sudo echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan ``` 注意:这个命令中的设备号(0:0:0:0)需要根据实际情况调整,可以通过`ls /sys/class/scsi_disk/`查看。 下面给出完整的命令行步骤(假设使用的是ext4文件系统,物理卷在/dev/sda3): </think>### 解决 Ubuntu 虚拟机中 `/dev/mapper/ubuntu--vg-ubuntu--lv` 磁盘空间不足的方法 以下是完整操作流程(基于 LVM 逻辑卷管理): #### 🔧 步骤 1:确认可用空间 ```bash # 查看卷组剩余空间 sudo vgdisplay ubuntu-vg | grep "Free" # 查看逻辑卷状态 sudo lvdisplay /dev/mapper/ubuntu--vg-ubuntu--lv ``` 如果输出显示 `Free PE / Size > 0`,表示有可用空间可直接扩容[^4]。 #### 步骤 2:虚拟机磁盘扩容(VirtualBox/VMware) 1. 关闭虚拟机 2. 在虚拟机设置中增大虚拟磁盘容量 3. 启动虚拟机 #### 🔍 步骤 3:扫描新空间(无需重启) ```bash # 扫描新磁盘空间 sudo echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan # 验证磁盘扩容 sudo fdisk -l | grep "Disk /dev/sda" ``` > 📌 注意:设备路径 `0:0:0:0` 需通过 `ls /sys/class/scsi_disk/` 确认 #### ⚙ 步骤 4:扩展物理卷(PV) ```bash # 扩展物理卷容量 sudo pvresize /dev/sda3 # 替换为你的物理卷名 # 检查卷组空间 sudo vgdisplay ubuntu-vg ``` 此时应显示新增的 `Free PE / Size` #### 📈 步骤 5:扩展逻辑卷(LV) ```bash # 扩展逻辑卷(使用100%空闲空间) sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv ``` 替代方案: ```bash # 增加固定大小(例如10GB) sudo lvextend -L +10G /dev/mapper/ubuntu--vg-ubuntu--lv ``` #### 🌱 步骤 6:扩展文件系统 根据文件系统类型选择: ```bash # ext4文件系统 sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv # xfs文件系统 sudo xfs_growfs / ``` #### ✅ 步骤 7:验证扩容结果 ```bash # 查看最终空间 df -h | grep "/dev/mapper/ubuntu--vg-ubuntu--lv" # 验证文件系统完整性 sudo fsck -f /dev/mapper/ubuntu--vg-ubuntu--lv ``` ### 💡 关键注意事项 1. **操作前务必创建快照**:避免操作失误导致数据丢失 2. **识别文件系统类型**:使用 `df -Th` 确认文件系统(ext4/xfs) 3. **空间连续性要求**:新增空间必须与原有分区物理连续 4. **LVM 命名规范**:Ubuntu 默认卷组名通常为 `ubuntu-vg`,逻辑卷为 `ubuntu-lv`[^1] ### ⚠ 常见问题解决方案 **问题:`resize2fs` 报错 "filesystem is mounted"** 👉 解决方案:确保文件系统处于卸载状态,或使用 Live CD 启动后操作 **问题:扩容后空间未生效** 👉 解决方案: ```bash # 强制内核重读分区表 sudo partprobe # 重启LVM服务 sudo systemctl restart lvm2-lvmetad.service ``` **问题:卷组无空闲空间** 👉 解决方案: 1. 检查是否遗漏 `pvresize` 步骤 2. 确认虚拟机磁盘实际已扩容成功 3. 验证是否扫描到新空间(`dmesg | grep sda`) > 完整操作流程参考:LVM 逻辑卷管理文档[^2] [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值