阮一峰老师的博客摘录。
另外还有一个系列贴,讲解数据包如何在网络上进行传输,看完后对网络模型就有了很清楚的认识。
Packet Traveling – Practical Networking .net
五层网络协议模型
实体层(物理层)
物理层就是实体的网卡、光缆、双绞线等,通过物理的方式连接在一起,规定了电气层面的一些特性,用来传输高低电平,也就是 0、1 信号。
链接层
数据链路层定义 0、1 电信号的分组方式。以太网(Ethernet)协议是链路层中一个比较重要的协议。
以太网规定,一组电信号构成一个数据包,叫做帧(Frame)。每一帧分成两个部分:Head 和 Data。
Head 的长度,固定为 18 字节。Data 的长度,最短为 46 字节,最长为 1500 字节。因此,整个 frame 最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。
Mac 地址
以太网协议的头部包含了收发者的信息,收发者的信息通过 mac 地址进行标识。Mac 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示,前 6 个十六进制数表示厂商编号,后 6 个是网卡流水。
广播 & ARP
通过 ARP(Address Resolution Protocol) 协议可以通过 IP 地址获取到 Mac 地址。主机发送信息时将包含目标 IP 地址的 ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;局域网上主机收到广播后把广播中的 IP 地址与自身 IP 地址做比较,如果相同则回应 Mac 地址,否则就丢弃广播消息;主机收到返回消息后将该 IP 地址和 Mac 地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源。
知道了目标的 Mac 地址后,以太网采用了一种很”原始”的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。局域网内所有主机收到广播后与自身的 Mac 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做”广播”(broadcasting)。
有了数据包的定义、网卡的 Mac 地址、广播的发送方式,”链接层”就可以在多台计算机之间传送数据了。
网络层
只依靠数据链路层确实可以实现不同主机间的通信,但有个问题是以太网采用广播的方式太消耗资源了,每个包都会广播到网络中,效率太低,而当主机越来越多时该机制基本就无效了。
互联网的子网络就是用来解决这个问题的,也就是网络层的作用。引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做”网络地址”,简称”网址”。如果是同一个子网络,就采用广播方式发送,否则就发送给默认网关通过”路由”方式发送。
网络地址帮助我们确定计算机所在的子网络,Mac 地址则将数据包送到该子网络中的目标网卡。
IP 协议
IP 用于规定网络地址,该地址称为 IP 地址。
IPv4 中网络地址由32个二进制位组成,分为 4 段,每段 8位,从 0.0.0.0 一直到 255.255.255.255。
互联网上的每一台计算机,都会分配到一个 IP 地址。前一部分代表网络,后一部分代表主机。子网掩码用来区分网络和主机,它的网络部分全部为1,主机部分全部为0。IP 地址与子网掩码做与运算后即可得到子网地址,而 IP 地址剩余的部分即为主机号。
传输层
通过 IP 地址和 Mac 地址,我们已经可以在互联网上任意两台主机上建立通信。但还有问题是,同一台主机上有许多程序(进程)都需要用到网络,比如,边浏览网页,边在线聊天,当一个数据包从互联网上发来的时候,如何知道它是表示网页的内容,还是表示在线聊天的内容?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做”端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
传输层的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix 系统就把主机+端口,叫做”套接字”(socket)。有了它,就可以进行网络应用程序开发了。
TCP & UDP
TCP 和 UDP 是传输层的两个重要协议,UDP 实现简单可靠性差,DNS 查询用到了 UDP。TCP 相对 UDP 而言,带有确认机制,确保数据不会丢失,但实现复杂且需要消耗更多的资源。
应用层
应用层就是规定应用程序的数据格式。这里的协议就很多了,HTTP、HTTPS、FTP、SSH 等等。
HTTP 协议
HTTP 协议(Hyper Text Transfer Protocol)用于从服务器传输超文本到本地浏览器。
HTTP 默认端口 80,HTTPS 默认端口443。
HTTP 无连接、无状态。
客户端请求消息包含:请求行、请求头部、空行、请求数据。
服务器响应消息包含:状态行、消息报头、空行、响应正文。
客户端请求方法:
方法 | 描述 | |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
服务器响应码:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |