在学习完TCP/IP协议后,个人感觉有几个重要的概念值得重视,所以记录在此。
体系结构
TCP-IP协议的体系结构如下图,其中,数据链路层、网络层、传输层在内核中实现,因为这些既高效又稳定,而应用层负责处理应用程序的逻辑,因此在用户态实现。
数据链路层之ARP协议
ARP协议属于数据链路层中的协议。网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须先将目标机器的IP地址转换为其物理地址,才能使用数据链路层提供的服务,这就是ARP协议的用途。
网络层及网络层协议
网络层实现数据包的选路和转发。通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的,网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。同时,网络层对上层协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双方是直接相连的。网络层的协议有ICMP协议和IP协议。
传输层之TCP协议
TCP协议(传输控制协议)为应用层提供可靠的、面向连接的和基于流的服务。TCP协议使用超时重传、数据确认等方式来确保数据包正确地发送至目的端,因此TCP服务是可靠的。TCP服务是基于流的。基于流的数据没有边界限制,它源源不断地从通信的一端流入另一端。发送端可以逐个字节地向数据流写入数据,接收端也可以逐个字节地将它们读出。
传输层之UDP协议
UDP协议为应用层提供不可靠、无连接和基于数据报的服务。使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。UDP协议是无连接的,即通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息)。基于数据报的服务,是相对基于流的服务而言的。每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。
协议封装
所谓封装,其实就是将上层的数据加上本层的头部或尾部。应用层数据经过层层封装,最终被封装成帧的形式,帧是最后在物理网络上传送的字节序列。
协议分用
当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议通过处理本层负责的头部数据,以获得所需的信息,这就是分用。最终会将应用数据传递给应用层使用。
协议类型
由于IP协议、ARP协议、RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段来区分它们。以以太网帧为例,它使用2字节的类型字段来标识上层协议。如果主机接收到的以太网帧类型字段的值为0x800,则为IP数据报,以太网驱动程序就将帧交付给IP模块。若值为0x806,则为ARP请求或应答报文。若值为0x835,则帧的数据部分为RARP请求或应答报文。
socket
Socket是一套应用程序编程接口,即API。能够实现系统调用,使得应用程序能够访问内核中协议提供的服务。
由socket定义的API提供两点功能:一是将应用程序的数据从用户缓冲区复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据,或从内核TCP/UDP接受缓冲区复制数据到用户缓冲区,以读取数据。二是应用程序可以通过它们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信的行为。