为了方便交流,人类发明了语言,约定了每个汉字符号代表的意思。同理,为了机器之间的交流,我们也需要一些“约定”,我们称这些约定为“协议”。
在互联网中,所有的计算机都是由 路由器和交换机 连接到一起的。计算机之间的传输媒介是光信号和电信号。通过“频率”和“强弱”来表示 0 和 1 这样的信息。要想传递不同的信息,就需要约定好双方的数据格式。
1. OSI七层协议(物数网传会表应)
分层名称 | 功能 | 作用 |
---|---|---|
应用层 | 针对特定应用的协议 | 针对每个应用的协议: 电子邮件(电子邮件协议), 远程登陆(远程登录协议) |
表示层 | 可确保一个系统的应用层所发送的信息 可以被另一个系统的应用层读取。 | 设备固有的数据格式和 网络标准数据格式的转化 |
会话层 | 通过传输层建立数据传输的通路。 通信管理。负责建立和断开通信连接 (数据流动的逻辑通路)。管理传输层以下的分层 | 何时建立连接,何时断开连接?保持多久的连接? |
传输层 | 定义了传输数据的协议和端口号。如TCP和UDP。 管理两个节点之间的数据传输。 负责可靠传输(确保数据被可靠地传送到目标地址) | 主要是将从下层接收的数据 进行分段和传输, 到达目的地后再进行重组, 常常把这一层数据叫做段 |
网络层 | 在位于不同地理位置的网络中的 两个主机系统之间提供连接和路径选择。 即地址管理与路由选择 | 经过哪个路由传递到目标地址? |
数据链路层 | 定义了如何让格式化数据以帧为单位进行传输, 以及如何让控制对物理介质的访问。 这一层还提供错误检测与纠正, 以确保数据的可靠传输。 | 数据帧与比特流之间的转换 |
物理层 | 主要定义物理设备标准。 如:网线的接口类型、 光纤的接口类型、 各种传输介质的传输速率等。 | 传输比特流,就是由“0”“1”转化为电路强弱来进行传输、 到达目的地后再转化为1,0。 也就是我们常说数模转换与模数转换, 这一层的数据叫做比特。 |
2.TCP/IP五层模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇,是常用的网络协议,所以要记住每一层及其含义。
TCP/IP协议通讯采用了5层的层级结构,每一层都呼叫它的下一层所提供的的网络来完成自己的需求。
分层名称 | 描述 | 设备 | 常用协议 |
---|---|---|---|
物理层 | 负责光/电信号的传递方式, 比如现在以太网通用的网线(双绞线), 早期以太网采用的同轴电缆(现在主要用于有线电视), 光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率,传输距离,抗干扰性等。 | 集线器(Hub)工作在物理层 | 硬件 |
数据链路层 | 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动,帧同步(就是说从网线上检测到什么信号算作新帧的开始),冲突检测(如果检测到冲突就自动重发),数据差错校验等工作 | 交换机(Switch) | 以太网,令牌环网,无线LAN等标准 |
网络层 | 负责地址管理和路由选择,例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由) | 路由器(Router) | ARP, IP, ICMP |
传输层 | 负责两台主机之间的数据传输,如传输控制协议(TCP),能够确保数据可靠地从源主机发送到目标主机 | TCP, UDP, UDP-Lite, SCTP, DCCP | |
应用层 | 负责应用程序之间沟通,如简单电子邮件传输(SMTP),文件传输协议(FTP),网络远程访问协议(Telnet) | DNS, URI,HTML, HTTP,TLS/SSL,SMTP, POP,IMAP,MIME, TELNET,SSH,FTP, SNMP,MIB,SIP,RIP,LDAP |
3. 数据包封装和分用
我们已经了解到TCP/IP四层模型,那么数据在网络中到底是如何传输的呢?比如说A主机现在打算给B主机传输一条消息:“约吗?朋友”,我们直接把这条消息丢到网络中去传输,可以吗?当然是不行。因此我们就需要了解到数据报封装和分用的内容了。
- 在不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在数据链路层叫做帧(frame)
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)
- 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理。
封装过程
如上图所示:应用层的一段数据,经过逻辑封装,TCP封装,IP封装,帧封装,然后从网卡出去;接收端则是逆过程。其中TCP及以下的封装,一般不需要我们自己动手,仅考虑应用层的封装即可。
对于应用层的封装来说,有两种方法:
1、设置Appl首部。“用户数据”就是你实际要发送的数据,比如我们打算发送一个字符串:”asdfgh”,Appl首部就是你自己设计的一个包结构,比如在Appl首部里面设计一个4个字节的int数据,用来表示后面内容的长度:那么当你发送”asdfgh”的时候,Appl首部里面就是这个字符串的长度6,接收端先接受4个字节,得到长度,再按照长度接受内容。
2、另一种方法是在用户数据末端加上“结束标志”,http协议就是这么干的,用**\r\n\r\n**表示一段内容结束(当然你也可以选择其他的特定字符作为结束标志)。那么当你发送”asdfgh”的时候,其实就是发送”asdfgh\r\n\r\n”,接收端接受数据,遇到\r\n\r\n结束接受一段数据。