一、初识协议
1、认识协议
协议就是一种约定,网络上的共同标准就是网络协议。
2、协议分层
协议本质就是软件,为了模块化,解耦合,设计成层状结构。
其实分层这个概念早在语言学习阶段就已经接触过了:在学习继承时,子类继承自父类,当前出现了 父类 和 子类 这两层结构,父类可以不必关心子类的具体实现,需要时可以直接通过父类指针对子类成员或函数进行访问。多态也是一种分层。封装是描述再组织。
在进行分层后,上层无需关心下层的具体实现,只需要使用下层提供的功能即可,分层 思想很好的体现了计算机领域的设计哲学:任何计算机问题都可以通过添加一层软件层解决。
分层好处:实现解耦合,维护成本低。
OSI七层网络模型和TCP/IP协议簇
模型对比
层级介绍
物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆 (现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决 定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层。
数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太 网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层。
网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规 划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标 主机. 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。
一般而言:
对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容。
对于一台路由器, 它实现了从网络层到物理层。
对于一台交换机, 它实现了从数据链路层到物理层。
对于集线器, 它只实现了物理层。
二、为什么要有TCP/IP协议?
首先,我们自己的计算机里面也有协议,由于距离近,要解决的问题少,成本低。
但在网络通信中,主机与主机之间的距离变长,就会衍生出一系列问题,为了解决问题就会定出协议,不同性质的问题就要有不同性质的协议,协议的增多就会导致协议的分层。
网络通信中,传输数据不是目的,只是手段,使用数据才是目的。
由上面引出协议的第一个结论:TCP/IP协议是解决问题的方案。
三、TCP/IP协议与操作系统关系
虽然操作系统多种多样,但由于应用同一个网络协议,所以各个主机之间能通信。
主机A发出的结构体对象给主机B,由于应用同一个网络协议,所以B能立即识别。
协议的第二个结论:所谓协议,就是通信双方都认识的结构化数据类型。
快递单 + 货物 = 快递
协议报头 + 有效载荷 = 报文
四、网络传输基本流程
1、局域网(以太网)通信原理
两个主机在同一个局域网可以直接通信。前提:每台主机要有唯一标识(mac地址)
长度为48位, 即6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19) 在网卡出厂时就确定了, 不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可 能会冲突; 也有些网卡支持用户配置mac地址)。
形象表示以太网通信流程:
结论:
(1)在以太网中,任何时候只允许一台主机向网络发消息。
(2)如果多台主机同时发消息,就会发生数据干扰,叫数据碰撞。
(3)所有发送数据的主机进行数据检测和碰撞避免(如果碰撞,主机休眠随机时间)
(4)没有交换机的情况下,一个以太网是一个碰撞域。
(5)局域网通信中,主机对收到的报文进行 mac 地址判断是否是发给自己的。
前三条证明以太网是临界资源,只不过保护的方式不是加锁,而是数据检测和碰撞避免。
详细通信流程:
上一层交给我的数据是有效载荷,我加上我自己的报头传入下一层。
网络协议的共性:
(1)分用:除了应用层,每一层协议都必须解决一个问题:自己的有效载荷应该交给上层哪一协议。
(2)解包:报头和有效载荷分离。
2、跨网络通信原理
IP地址
IP协议有两个版本, IPv4和IPv6。
IP地址是在IP协议中, 用来标识网络中不同主机的地址,对于IPv4来说, IP地址是一个4字节, 32位的整数,我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
mac地址
mac地址长度为48位, 及6个字节。
一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19) 在网卡出厂时就确定了, 不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可 能会冲突。也有些网卡支持用户配置mac地址).
跨网络通信流程
结论:
(1)网络层(就是ip层)向上(包括网络层)看到的ip报文都是一样的,都至少是IP报文。
(2)IP可以屏蔽底层网络差异,因为到网络层之下的报文会根据src,dst封装对应的mac帧,由路由器进行发送,此时报头是mac帧,不论底层用的什么发送方式(以太网,令牌环,无线网等)都不会影响到IP报文,只有到了网络层才能看到IP报文。
(3)所有的网络都是IP网络。
IP地址与mac地址比较
IP地址:最终目标
mac地址:下一个目标
五、端口
1、背景
首先理解:数据传输到主机不是目的,而是手段,到达主机内部,再交给主机内的进程才是目的,此时人一旦打开进程就可以使用数据。
所以我们一定要有网络层面的唯一标识一台主机中的进程的标识符:端口。
2、端口特点
端口号是一个2字节16位的整数。
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理。
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用。
标识进程唯一性为什么不用pid而是用port?
pid是系统层面概念,和IP连接导致网络与系统强耦合。
3、端口号范围划分
0 ~ 1023:知名端口号,HTTP,FTP,SSH等广为使用的应用层协议。是固定的。
1024 ~ 65535:操作系统动态分配的端口号,客户端程序端口号。
六、传输层代表协议
1、TCP协议特点
传输层协议
有连接
可靠传输
面向字节流
2、UDP协议特点
传输层协议
无连接
不可靠传输
面向数据报
七、网络字节序
1、回顾大小端
其中数据 0x1234abcd,12是高位,cd是低位。
2、怎么解决两台主机大小端存储不一致问题?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可。
3、库函数做网络字节序和主机字节序的转换接口
h表示host,n表示network,l表示32位长整数,s表示16位短整数。
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。
如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
八、socket常见接口
1、理解 sockaddr
其中 struct sockaddr_in结构体是用来跨网络进程间通信,struct sockaddr_un结构体是用来本地进程间通信。使用的函数结构相同,不用进行另外转换。struct sockaddr 用来指向两种结构体,实现两种通信方式上层都能用同一个结构体接受。实现了c语言版的多态。