文章目录
教程推荐:
人工智能教程,点击这里查看,通俗易懂,风趣幽默
C/C++教程,点击这里查看,以项目为主导从入门到精通
前言
TCP/IP协议族是一个四层协议系统
从下到上分别为数据链路层、网络层、传输层、应用层
每一层都通过若干协议实现完成不同的功能,且上层协议使用到下层协议的服务
数据链路层
数据链路层实现了网卡接口的网络驱动程序,处理数据在物理媒介上的传输,并隐藏了各个物理媒介之间的区别,为上层协议提供了统一的接口。
数据链路层使用到的两个常用协议为ARP(Address Resolve Protocol,地址解析协议)协议和RARP(Reverse Address Resolve Protocol,逆地址解析协议)协议
这两个协议实现了ip地址和机器物理地址之间的转换(通常为MAC地址)
作用:
网络层是通过ip寻址的,而数据链路层只能通过物理地址寻址,因此网络层需要先将ip地址通过ARP协议转换为物理地址才能使用物理链路层提供的服务。而RARP仅用于某些无盘工作站,因缺少存储设施,无法存储ip地址,则可以使用RARP协议,通过物理地址向管理员查询自己的ip地址
网络层
通常网络上的两台主机之间不是直接相连接的,两种之间存在多个中间节点(路由器)。网络层的作用就是在众多的节点中选择中间节点,使两台主机能够通信,确定两台主机的通信路径。
同时,网络层向上层隐藏了网络拓扑结构的细节,使得在传输层和应用层看来,通信双方是直接连接到一起的。
网络层最核心的协议是ip协议(Internet Protocol,因特网协议)。IP协议根据数据包的目的地ip决定如何投递,如果数据包不能直接发送给目标主机,那么ip协议就为它寻找下一个合适的路由器进行跳转,并将数据包交给该路由器,多次重复直到数据包最终到达目标计算机,或者由于发送失败而被丢弃。
总结来说,ip协议就是通过逐跳(hop by hop)的方式确定通信路径
网络层另一个重要的协议是ICMP(Internet Control Message Protocol,因特网控制报文协议),它是ip协议的重要补充,主要用来检测网络连接。
比如我们常用的ping命令确定两台主机之间是否能够通信,就是采用的该协议
报文格式如图:
8位类型用于区别报文类型,它将ICMP报文区别分为了两大类
一类是差错报文,主要用来回应网络错误,比如目标不可(3)到达和重定向(5)
另一类是查询报文,用来查询网络信息,比如ping命令中就使用的查看目标是否可达(8)
有的ICMP报文还使用8位代码段来进一步细分,比如重定向报文(5)中,使用代码值0表示网络重定向,代码之1表示对主机重定向
16位校验和字段用于对整个报文(包括头部和内容)进行循环冗余校验(Cyclic Redundancy Check,CRC),以及检验报文是否在传输过程中是否损坏。
需注意的是,ICMP协议并非严格意义上的网络层协议,因为它使用了同一层的IP协议提供的服务
传输层
传输层为两台主机上的应用提供端到端(end to end)的通信。
与网络层不同的是,传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程
传输层主要协议有三个,TCP协议,UDP协议和SCTP协议
1.TCP协议(Transmission Control Protocol,传输控制协议)
目的是为应用层提供可靠的、面向连接的、和基于流的服务。TCP协议使用了超时重传、数据确认等方式确保数据包被正确的发送至目的地,使得其可靠。
使用TCP协议通信的双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接状态、读写缓存区,以及定时器等。
通信结束,双方必须关闭连接来释放这些内核数据。
2.UDP协议(User Datagram Protocol,用户数据包协议)
该协议与TCP协议完全相反,它为应用层提供不可靠、无连接和基于数据包的服务
这意味着,UDP协议无法保证数据可以正确的传输到目的端,如果数据在中途丢失,或目的端通过数据校验发现数据错误而将其丢弃,UDP协议只会简单的通知应用程序发送失败。
同时由于处于无连接状态,所以每次发送数据都需要明确指定接收端的地址(IP 和端口等)
需要注意的是,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将所有内容一次性读出,否则数据将被截断。
3.SCTP协议(Stream Control Transmission Protocol,流控制传输协议)
这是一种比较新的传输层协议,为在因特网上传输电话信号而设计。
应用层
应用层负责处理应用程序的逻辑,比如文件传输、名称查询和网络管理等,所以工作在用户层。而数据链路层、网络层和传输层负责处理网络通信细节,这部分必须稳定而高效,因此它们都在内核空间中实现。
应用层协议有很多,比如:
- telnet协议,一种远程登录协议,它使我们能在本地完成远程任务。
- OSPF协议(Open Shortest Path First,开放最短路径优先),是一种动态路由协议更新协议,用于路由器之间的通信,以告诉对方各自的路由信息
- DNS协议(Domain Name Service,域名服务),提供机器域名到IP地址的转换
注意ping是应用程序,而不是协议,它利用了ICMP报文检测网络连接,是调试网络环境的必备工具
通信流程
1.发送数据的过程
首先,上层协议如何利用到下层协议提供到的服务呢?答案就是封装
如图,当在应用层需要发送一段数据时,就需要将该数据通过协议栈从上往下依次传递,同时每一层协议都会在上一层数据的基础上加上自己的头部信息
比如我们常见的TCP/UDP协议,在接收到我们要发送的数据时,就会在我们要发送的数据前面加上自己的头部信息,这就是封装。
以TCP为例,如图,经过TCP协议封装后的数据称为TCP报文段(TCP message segment)或简称TCP段。
上面说到,TCP协议会在内核中存储相关数据,为通信双方维持一个连接,这部分数据中就有TCP头部信息和TCP内核缓存区(发送缓存区和接收缓存区),一同构成TCP报文段,如图虚线所示。
当你在应用程序中调用send(或write)函数发送数据时,内核中的TCP模块首先会把这些数据复制到与当前连接对应的TCP内核发送缓存区中,然后TCP模块调用下层的IP协议服务,将TCP报文段(TCP头部信息和TCP发送缓存区中的数据)作为参数传入。
IP层接收到了上层的数据(TCP报文段),再次进行封装,过程与TCP相同,经IP封装后的的数据叫做IP数据报(IP datagram),并再次将封装好的数据(IP头部 TCP头部 要发送的数据)传入下一层:数据链路层
经有上面同样的过程,数据链路层再进行一次封装,加入对应的头部信息,封装后的数据称为帧(frame),需要注意的是,根据传输介质的不同,帧的类型也不相同,比如以太网上传输的称为以太网帧,令牌环网络传输的称为令牌环帧
以以太网帧为例,封装细节如图:
以太网帧使用6字节的目的物理地址和源物理地址来表示通信双方,2字节类型,和要传输的数据(IP头部,TCP头部,数据),以及最后的CRC(循环冗余校验)
可以看到,再以太网中,帧最多能携带的上层数据为1500个字节,这就意味着,过长的IP数据报需要被分片传输。帧是最终在物理网络上传送的字节序列。
至此就完成了一次完整的数据封装。
2.接收数据的过程
当帧达到目的主机时,将沿着协议栈自低而上依次传递,各层协议依次处理帧中本层负责的头部,获取到所需信息,并最终将处理后的数据交给应用程序。该过程称为分用。
由图可看到,当帧进入目的第的以太网驱动后,通过以太网帧的2字节类型数据区分帧类型交给哪个协议处理(ARP IP RARP),如果为0x800则为IP数据报,0x806则为ARP请求或应答报文,0x835则为RARP请求或应答报文。
同理,由于ICMP,TCP,UDP都使用IP协议提供的服务,所以IP数据报的头部采用16位的字段来区分他们。
TCP和UDP又通过数据报头部中16位端口号区分不同的应用程序,比如DNS协议对应端口53,HTTP协议对应端口80。
通过分装和分用的过程,顶层应用仿佛在直接通信,而感受不到底层繁琐的过程。