前言
文章目录
一、协议
1.1 基本概念
从应用的角度出发,定义为
数据传输
和数据解释
的规则;
常见协议:
http
、tcp
;
1.2 典型协议
传输层:TCP/UDP;
应用层:HTTP、FTP;
网络层:IP、ICMP、IGMP;
网络接口层:ARP、RARP;
TCP:传输控制协议,面向连接的、可靠的、基于字节流的传输层通信协议;
UDP:用户数据报协议,OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传输服务;
HTTP:超文本传输协议,最为广泛的网络协议;
FTP:文件传输协议;
IP:因特网互联协议;
ICMP:为Internet控制报文协议,是TCP/IP的子协议,用于IP主机、路由器之间传递控制消息;
IGMP:Internet控制报文协议,运行在主机和组播路由器之间;
ARP:正向协议解析,通过已知的IP,寻找对应主机的MAC地址;
RARP:反向地址转换协议,通过MAC地址确定IP地址;
二、网络应用程序设计模式
2.1 C/S模式
传统的【客户端/服务器】模式,需要在通讯两端各自不是客户机和服务器来完成通信;
优点:
- 客户端位于目标主机上,保证了性能,能缓存数据,提高数据传输效率;
- 可自定义协议;
缺点:
- 开发工作量大;
- 对用户隐私安全性构成威胁;
2.2 B/S模式
【浏览器/服务器模式】,只需在
一端部署
服务器,而另外一端使用
每台PC都默认配置的浏览器即可;
优点:
- 开发量较小;
- 不受平台限制;
缺点:
- 网络应用支持受限;
- 协议选择不灵活;
三、分层模型
3.1 OSI 七层模型
物理层:
* 主要定义物理设备标准;
* 主要作用是传输比特流(数模互转)
数据链路层:
* 定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问;
* 主要作用提供错误检测和纠正,以确保数据的可靠传输;
网络层:
* 位于不同地理位置的网络中的俩个主机系统之间提供连接和路径选择;
* 提高用户的访问数;
传输层:
* 定义了一些传输数据的协议和端口号;
* 主要作用将从下层接收的数据进行分段和传输,到达目的地后在重组(段数据);
会话层:
* 通过传输层建立数据传输的通路;
* 主要在你的系统之间发起会话或者接受会话请求;
表示层:
* 可确保一个系统的应用层所发送的信息可被另一个系统的应用层读取;
* 表示层会通过使用一种通格式来实现多种数据格式之间的转换;
应用层:
* 最靠近用户的OSI层;
* 主要作用为用户的应用程序提供网络服务;
3.2 TCP/IP四层模型
应用层:
Telnet、FTP、email等;
传输层:
TCP、UDP
TCP简述:
- TCP是一种
面向连接
的、可靠的协议
,类似打电话,电话互通即建立了连接,然后说话就行了,这边说的话那边保证听得到,并且是按顺序,挂机断开连接;- TCP传输的双方需要首先建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。
UDP简述:
- UDP是
无连接
的传输协议,不保证可靠性
,类似寄信,信放到邮筒,既不能保证信件在邮递过程中不会丢失,也不能保证信件寄送顺序。使用UDP协议的应用程序需要自己完成丢包重发、消息排序等工作。
网络层:
IP、ICMP、IGMP
链路层
设备驱动程序及接口卡
四、网络之间如何进行通信
4.1 计算机通过TCP/IP,在同一网段中通信过程
4.2 计算在不同网段中,经过路由器的过程
链路层:
- 有
以太网
、令牌环网
等标准,链路层负责网卡设备的驱动
、帧同步
(即从网线上检测到什么信号算作新帧的开始)、冲突检测
(如果检测到冲突就自动重发)、数据差错校验
等工作。- 交换机是工作在链路层的网络设备,可以在
不同的链路层
网络之间转发数据帧(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间),由于不同链路层的帧格式不同,交换机要将进来的数据包拆掉链路层首部
重新封装之后再转发。
网络层:
- 网络通过
IP地址
来标识,Inter-net上有大量路由器负责根据IP地址选择合适的路径转发数据包
,数据包从Internet上的源主机到目的主机往往要经过十多个路由器。- 路由器是工作在
第三层
的网络设备,同时兼有交换机
的功能,可以在不同的链路层接口之间转发数据包,因此路由器需要将进来的数据包拆掉网络层
和链路层
两层首部并重新封装。IP协议不保证传输的可靠性,数据包在传输过程中可能丢失,可靠性可以在上层协议或应用程序中提供支持。- 主要负责点(主机)到点(路由器)的传输
传输层:
- 主要负责端(主机)到端(目的主机)的传输;
4.3 目的主机收到数据包,如何经过各层协议栈后到达应用程序呢?
以太网驱动程序首先根据以太网首部中的
上层协议
字段确定该数据帧的有效载荷
(除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,再交给相应的协议处理。
- 若是
IP数据报
,IP协议再根据IP首部中的上层协议
字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP,然后交给相应的协议处理;- 若是
TCP段或UDP段
,TCP或UDP协议再根据TCP首部或UDP首部的端口号
字段将应用层数据交给用户进程。端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程;- 虽然
IP、ARP和RARP
数据报都需要以太网驱动程序来封装成帧
,但是从功能上划分,ARP
和RARP
属于链路层
,IP
属于网络层
。- 虽然
ICMP、IGMP、TCP、UDP
的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,TCP和UDP属于传输层。
五、协议格式
5.1 数据包是如何进行封装
传输层及其以下的机制由
内核
提供,应用层
由用户进程
提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节
,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈
发到网络上时,每层协议都要加上一个数据首部
,称为封装
;
- 不同的协议层对数据包有不同的称谓,在
传输层
叫做段
,在网络层
叫做数据报
,在链路层
叫做帧
。- 数据封装成
帧
后发到传输介质上,到达目的主机后每层协议再剥掉
相应的首部
,最后将应用层数据交给应用程序处理。
5.2 以太网格式
- MAC地址:
源地址
和目的地址
是指网卡的硬件地址,长度是48
位,是在网卡出厂时固化
的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP
,帧尾是CRC校验码。- 以太网帧:以太网帧中的数据长度规定
46~1500
字节,ARP
和RARP
数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元
(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。ifconfig命令输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。
5.3 ARP数据报格式
通信时,不知道目的主机的硬件地址?
- 在网络通讯时,源主机的应用程序需要
目的主机的IP
和端口号
,若不知道目的主机的硬件地址,而数据包首先是被网卡
接收到再去处理上层协议
,若接收到的数据包的硬件地址与本机不符,则直接丢弃。故在通讯前必须获得目的主机的硬件地址。
该如何解决这一问题呢?
- 通过使用ARP协议可以,源主机发出ARP请求,询问“IP地址是xxx.xxx.xxx.xxx的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
ARP缓冲表会过期
- 每台主机都维护一个ARP缓存表,可以用
arp -a
命令查看。缓存表中的表项有过期时间(一般为20分钟
),如果20分钟内没有再次使用某个表项,则该表项失效,需要再次发送ARP请求获得目的主机的硬件地址。
ARP如何进行请求
源MAC地址
、目的MAC地址
在以太网首部
和ARP请求
中各出现一次,对于链路层
为以太网
的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;硬件类型
指链路层网络类型
,1为以太网;- 协议类型指要
转换的地址类型
,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节);- op字段为1表示
ARP请求
,op字段为2表示ARP应答
。- 以太网首部:目的主机采用
广播地址
,源主机的MAC地址
是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。
5.4 IP段格式
IP数据报的
首部
长度和数据
长度都是可变长
的,但总是4字节的整数倍
。
- 对于IPv4,4位
版本字段
是4;4位首部长度
的数值是以4字节
为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节
;8位TOS字段
有3个位
用来指定IP数据报的优先级
(目前已经废弃不用),还有4个位
表示可选的服务类型,还有一个位总是0;总长度
是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报
,16位的标识加1,可用于分片和重新组装数据报
。3位标志
和13位片
偏移用于分片。- TTL:源主机为数据包
设定一个生存时间
,比如64,每过一个路由器就把该值减1
,如果减到0
就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包
,因此这个生存时间的单位不是秒,而是跳(hop)
。- 协议字段指示上层协议是
TCP
、UDP
、ICMP
还是IGMP
。然后是校验和
,只校验IP首部
,数据的校验由更高层协议负责。IPv4的IP地址长度为32位
。
5.5 UDP数据报格式
UDP协议不面向连接,也不保证传输的可靠性例如:
发送端的UDP协议层
只管把应用层传来的数据封装成段交给IP协议层
即可,若因网络故障该段无法发到对方,【UDP协议层也不会给应用层返回任何错误信息】;接收端的UDP协议层
把收到的数据根据端口号交给相应的应用程序即可,若发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时已乱序,【UDP协议层
也不保证按发送时的顺序交给应用层】;- 通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来
提取和处理
,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包,【UDP协议层并不报告这种错误】。
故在使用该协议时该如何避免以上情况的发生呢?
使用
UDP协议
的应用程序必须考虑到以上问题
并实现适当的解决方案
,例如【等待应答、超时重发、为数据包编号、流量控制】等。一般使用UDP协议的应用程序实现都比较简单
,只是发送一些对可靠性要求不高
的消息,而不发送大量
的数据。例如,基于UDP的TFTP协议
一般只用于传送小文件
(所以才叫trivial的ftp),而基于TCP的FTP协议
适用于各种文件
的传输;