云溪的 blog
  • Archive
  • Media
  • Search
  • Tags
  • About
Home

Posts

detail  [draft]

网络模型 国际标准组织(ISO)制定了OSI模型。这个模型把网络通信的工作分为7层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。 而在我们实际应用中分为五层,如上图tcp/ip就是分了五层,越往上就越靠近用户,越往下越靠近硬件。 层与协议 每一层都完成一种功能,为了完成这些功能,就需要共同遵守 一些规则,而这些规则就叫做“协议”(protocol) 网络的每一层,都定义了很多协议。这些协议的总称,叫“TCP/IP协议”。它是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。这里需要注意,TCP/IP协议是一个大家族,不仅仅只有TCP和IP协议,它还包括其它的协议,如下图: 物理层 两台计算机进行通讯 ,首先要做的就是将两台计算机进行连接 。物理层主要作用是将两台计算机通过有线介质(双绞线、光纤)或无线介质(无线电、微波、激光、红外线)进行连接,物理层传输的数据 只有0和1 链路层 定义 单纯的 0 和 1 没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?这就是“链接层”的功能,它在“物理层”的上方,确定了 0 和 1 的分组方式。 以太网协议 早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做“以太网”(Ethernet)的协议,占据了主导地位。 以太网规定,一组电信号构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。 “标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;“数据"则是数据包的具体内容。 “标头”的长度,固定为 18 字节。“数据"的长度,最短为 46 字节,最长为 1500 字节。因此,整个"帧"最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。 MAC 地址 上文提到标头里存者发送者和接收者信息,那么发送者和接收者是如何标识的呢? 以太网规定,连接网络的所有设备,都必须具有“网卡”接口。数据包必须从一个网卡传输到另一个网卡。通过网卡能够使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址,就是数据包的发送地址和接收地址,这叫做 MAC 地址。 MAC地址,用于标识网络设备,类似于身份证号。每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址(理论上全球唯一),长度是 48 个二进制位,通常用 12 个十六进制数表示。 网络层 网络层的由来 以太网协议,依靠 MAC 地址发送数据。理论上,单单依靠 MAC 地址,北京的网卡就可以找到深圳的网卡了,技术上是可以实现的。 但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一“包”,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难(广播风暴)。 互联网是无数子网络共同组成的一个巨型网络,很像想象北京和深圳的电脑会在同一个子网络,这几乎是不可能的。 因此,必须找到一种方法,能够区分哪些 MAC 地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用“路由”方式发送。(“路由”就相当于现象生活中的路标,规定这些数据包的走向,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC 地址本身无法做到这一点。它只与厂商有关,与所处网络无关. ...

February 27, 2019 · 1 min · 云溪

编译安装php常见问题

configure: error: libxml2 not found. 详细错误如下: configure: error: libxml2 not found. Please check your libxml2 installation. make: *** No targets specified and no makefile found. Stop. make: *** No rule to make target 'install'. Stop. 解决方法: $ sudo apt-get install libxml2-dev configure: error: png.h not found. 详细错误如下: configure: error: png.h not found. make: *** No targets specified and no makefile found. Stop. make: *** No rule to make target 'install'. Stop. 解决方法: $ sudo apt-get install libpng-dev configure: error: freetype-config not found. 详细错误如下: ...

February 24, 2019 · 1 min · 云溪

virtualbox 分享文件夹,无权访问问题

背景 在 windows 下使用 virtualbox 安装 linux 系统 实现 windows 下开发虚拟机里跑测试的效果 起因 由于项目使用文件目录是可以在 windows 和 linux 下共享的,因此使用 virtualbox 共享文件夹功能来实现项目文件夹在两个系统间共享,配置好共享文件后,发现在虚拟机的 linux 系统中没有权限操作目录. 百度之后发现原来是因为共享文件夹挂在后的文件是属于 vboxsf 组下的,而登陆用户不属于该组,因而无权对目录进行操作。 解决方法 既然知道原因,解决办法也是非常简单的就是将当前登录的用户加入 vboxsf 用户组即可: $ sudo usermod -aG vboxsf $(whoami) 需要注意的是该操作需要重启系统才能生效。

February 24, 2019 · 1 min · 云溪

gorm常见问题

sql: Scan error on column index 5, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time DATETIME转换问题 执行Rows.Scan()时报告错误 原因是在调用sql.Open()时没有将parseTime设置为True。加入parseTime即可修复问题: db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true") invalid memory address or nil pointer dereference on simple learning example. Maybe a bug with latest version 代码实例 package main import ( "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/postgres" ) var db *gorm.DB func init() { var err error db, err := gorm.Open("postgres", "host=localhost user=postgres dbname=postgres sslmode=disable password=pass") if err != nil { panic("failed to connect database") } db.AutoMigrate(&todoModel{}) } 重点在 db, err := gorm.Open("postgres", "host=localhost user=postgres dbname=postgres sslmode=disable password=pass") 代码处,由于上述代码中已经设置了全局变量 db 所以在接受赋值的时候不能用 := 二应该用 = 。 正确代码应该为 db, err := gorm.Open("postgres", "host=localhost user=postgres dbname=postgres sslmode=disable password=pass") ...

December 22, 2018 · 1 min · 云溪

Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1

使用 gorm 插入数据时爆出 Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1 的错误信息,搜索之后发现原来是因为 msyql5.7 及以上不允许时间戳字段插入 ‘0000-00-00’ 数据,修复方法也比较简单,去掉sql_model 中的 NO_ZERO_DATE 配置即可 方式一 sql 配置 使用 select @@GLOBAL.sql_mode; 查出原有的配置信息,将配置信息去除 NO_ZERO_DATE 并复制 使用 SET GLOBAL sql_mode = '去除 NO_ZERO_DATE 后的剩余配置项' 经过以上步骤就可以完成设置了。 方式二 配置文件配置 打开 mysql 配置文件: $ sodo vim /etc/my.cnf 在 [mysqld] 配置项下插入 sql_mode 配置 sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 重启 mysql 完成配置 sql_model 参数详解 ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 NO_AUTO_VALUE_ON_ZERO: 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。 STRICT_TRANS_TABLES: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 NO_ZERO_IN_DATE: 在严格模式下,不允许日期和月份为零 NO_ZERO_DATE: 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。 ERROR_FOR_DIVISION_BY_ZERO: 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL NO_AUTO_CREATE_USER: 禁止GRANT创建密码为空的用户 NO_ENGINE_SUBSTITUTION: 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常 PIPES_AS_CONCAT: 将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似 ANSI_QUOTES: 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符 参考链接 Error 1292 on update a row ...

December 22, 2018 · 1 min · 云溪
« Prev  Next  »
© 2025 云溪的 blog