Linux高性能服务器编程(一):TCP/IP协议族

现在的Internet主流协议族是TCP/IP协议族,它是一个分层、多协议的通信体系。

TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。

数据链路层:实现了网卡接口的物理驱动程序,以处理数据在物理媒介上的运输。有ARP(Address Resolve Protocol)地址解析协议和RARP(Reverse Address Resolve Protocol)逆地址解析协议两个主要的协议。数据链路层使用物理地址寻找一台机器,而上面的网络层使用ip地址寻找一台机器。

因此网络层必须要将ip地址转换为物理地址,才能使用数据链路层提供的服务。这就是ARP协议的作用。而RARP协议一般用于无盘的机器,这类机器无法自己记住自己的ip地址,因此要通过用自己的物理地址询问网络管理者自己的ip地址,运行RARP的管理者拥有所有机器物理内存到IP地址的映射。

网络层:网络层实现数据包的选路和转发。实际上两台主机间的网络不是直接连接的,中间有个许多个路由器节点,而网络层的作用就是在这些中间节点中找到一个连接的拓扑路径,并且该路径是对上层协议隐藏的,使得两台主机间看起来是直接连接的。

网络层最核心的协议就是常听说的IP协议(因特网协议)。什么是IP协议呢?IP协议根据目的IP地址决定如何投递数据包。如果不能直接发送给主机,那IP协议就为它寻找下一跳(next hop)路由器,反复实现这个步骤使数据包到达目的主机或者发送失败而被丢弃。

网络层另一个重要的协议是ICMP协议(因特网控制报文协议),它是IP协议的补充,用于检测网络连接。

 ICMP报文可以根据8位类型的值分成两个部分。一类是回应网络错误的:比如网络不可达或者重定向。还有一类是是查询报文,查询网络信息。16位校验和用于判断报文是否在传输过程中损坏。

因为ICMP要使用同一层的IP协议提供服务,所以它不是严格意义上的网络层协议。(上层协议使用下层协议提供的服务)

传输层: 传输层为两台主机上的应用程序提供端到端的通信。传输层只关心通信的起始端和目的端。

传输层协议主要有TCP协议、UDP协议和SCTP协议三个。

TCP协议:确保数据报正确发送到目的端,是可靠的。

UDP协议:与TCP相反,为应用层提供不可靠、无连接、基于数据报的服务。每个数据报都有一个长度,接收端必须要一次性全部读出,否则会发生截断。

SCTP协议:一种比较新的协议,为了在因特网上的电话信号传输而设计的。

应用层:应用层负责处理应用程序的逻辑。前面提到的三个层次都是在内核中实现的,负责网络通信细节,必须稳定高效。而应用层大多数是在用户空间实现的,因为它负责了太多逻辑,在内核实现会使内核过于庞大。应用层有很多协议,比较常用的如telnet协议,可以用于远程登录,还有DNS协议,将域名转换为IP地址。

上传协议如何使用下层协议提供的服务?

在这里使用了一个封装的方法。数据在上层协议向下层协议传递,每层协议都会在数据上添加上自己的头部信息。

 

 如图,TCP封装后的报文成为TCP报文。经IP协议封装的叫IP数据报,同理UDP协议封装后为UDP数据报。经过数据链路层封装后的数据叫帧。传输媒介不同,帧的类型也不同,例如经以太网传输的叫以太帧,经令牌环传输的叫令牌环帧。

 分用

当数据链路层获得帧后,将往上层传递,每一层协议处理自己的报头位置,最终将处理后的帧交给目标应用程序。

 如图为以太网帧分用过程。帧的头部需要给定指定字节让各个协议可以区分当前帧由哪个协议负责。帧经过上述分用步骤后,将封装前的原始数据返回到目标程序,在上层程序看来,封装和分用仿佛没发生过。

 

最好的开始时间是以前,其次是现在。
原文地址:https://www.cnblogs.com/dragonsbug/p/13617554.html