1.5 TCP/IP
1.5.1 网络协议
在计算机诞生后,从单机模式应用发展到将多台计算机连接起来,形成计算机网络,使信息共享、多机协作、大规模计算等成为现实,历经了20 多年的时间。计算机网络需要解决的第一个问题是如何无障碍地发送和接收数据。而这个发送和接收数据的过程需要相应的协议来支撑,按互相可以理解的方式进行数据的打包与解包,使不同厂商的设备在不同类型的操作系统上实现顺畅的网络通信。
TCP/IP(Transmission Control Protocol / Internet Protocol)中文译为传输控制协议/ 因特网互联协议,这个大家族里的其他知名协议还有HTTP、HTTPS、FTP、SMTP、UDP、ARP、PPP、IEEE 802.x 等。TCP/IP 是当前流行的网络传输协议框架,从严格意义上讲它是一个协议族,因为TCP、IP 是其中最为核心的协议,所以就把该协议族称为TCP/IP。而另一个是耳熟能详的ISO/OSI 的七层传输协议,其中OSI(Open System Interconnection)的出发点是想设计出计算机世界通用的网络通信基本框架,它已经被淘汰,本节略过。
TCP/IP 是在不断解决实际问题中成长起来的协议族,是经过市场检验的事实标准,已经很难被取代。就像即使键盘的布局不那么合理,比如字母A 被设计在左手小指位置,不利于敲击,但原来的键盘布局已经成为群体习惯的事实标准。TCP 分层框架图如图1-12 所示,为了表示网络拓扑图在连接层面上的机器对等理念,故图1-12中采用A 机器和B 机器的说法,而不是服务器和客户端的说法。
图1-12 TCP/IP 协议分层框架
- 链路层:单个0、1是没有意义的,链路层以字节为单位把0与1进行分组,定义数据帧,写入源和目标机器的物理地址、数据、校验位来传输数据。图1-13所示是以太网的帧协议。
图1-13 链路层报文结构
MAC 地址长6 个字节共48 位,通常使用十六进制数表示。使用ifconfig -a 命令即可看到MAC 地址。如图1-14 所示的f4:5c:89,即前24 位由管理机构统一分配,后24 位由厂商自己分配,保证网卡全球唯一。网卡就像家庭地址一样,是计算机世界范围内的唯一标识。
图1-14 MAC 地址
- 网络层:根据IP定义网络地址,区分网段。子网内根据地址解析协议(ARP)进行MAC 寻址,子网外进行路由转发数据包,这个数据包即IP 数据包。
- 传输层:数据包通过网络层发送到目标计算机后,应用程序在传输层定义逻辑端口,确认身份后,将数据包交给应用程序,实现端口到端口间通信。最典型的传输层协议是UDP 和TCP。UDP 只是在IP 数据包上增加端口等部分信息,是面向无连接的,是不可靠传输,多用于视频通信、电话会议等(即使少一帧数据也无妨)。与之相反,TCP 是面向连接的。所谓面向连接,是一种端到端间通过失败重传机制建立的可靠数据传输方式,给人感觉是有一条固定的通路承载着数据的可靠传输。
- 应用层:传输层的数据到达应用程序时,以某种统一规定的协议格式解读数据。比如,E-mail 在各个公司的程序界面、操作、管理方式都不一样,但是都能够读取邮件内容,是因为SMTP 协议就像传统的书信格式一样,按规定填写邮编及收信人信息。
总结一下,程序在发送消息时,应用层按既定的协议打包数据,随后由传输层加上双方的端口号,由网络层加上双方的IP 地址,由链路层加上双方的MAC 地址,并将数据拆分成数据帧,经过多个路由器和网关后,到达目标机器。简而言之,就是按“端口→ IP 地址→ MAC 地址”这样的路径进行数据的封装和发送,解包的时候反过来操作即可。
1.5.2 IP 协议
IP 是面向无连接、无状态的,没有额外的机制保证发送的包是否有序到达。IP首先规定出IP 地址格式,该地址相当于在逻辑意义上进行了网段的划分,给每台计算机额外设置了一个唯一的详细地址。既然链路层可以通过唯一的MAC 地址找到机器,为什么还需要通过唯一的IP 地址再来标识呢?简单地说,在世界范围内,不可能通过广播的方式,从数以千万计的计算机里找到目标MAC 地址的计算机而不超时。在数据投递时就需要对地址进行分层管理。举个例子,一个重要快递从美国发出,要发给中国浙江省台州市某小区的X 先生。快递公司需要先确定中国的转运中心(如浙江某转运中心),然后再从转运中心逐级配送到各个下级转运点。当快递到达该小区后,快递员大喊一声:“X 先生领快递啦!”虽然小区里包括X 先生在内的所有人都听到了快递员的喊声,但只有X 先生收取快递并当面打开确认,其他人确定不是叫自己则不用理会。IP 地址如图1-15 所示,即30.38.48.22,右边为物理层发送和接收数据的统计。
图1-15 IP 地址
IP 地址属于网络层,主要功能在WLAN 内进行路由寻址,选择最佳路由。IP 报文格式如图1-16 所示,共32 位4 个字节,通常用十进制数来表示。IP 地址的掩码0xffffff00 表示255.255.255.0,掩码相同,则在同一子网内。IP 协议在IP 报头中记录源IP 地址和目标IP 地址,如图1-16 所示。
图1-16 IP 报文格式
协议结构比较简单,重点说一下数据包的生存时间,即TTL(Time To Live),该字段表示IP 报文被路由器丢弃之前可经过的最多路由总数。TTL 初始值由源主机设置后,数据包在传输过程中每经过一个路由器TTL 值则减1,当该字段为0 时,数据包被丢弃,并发送ICMP 报文通知源主机,以防止源主机无休止地发送报文。这里扩展说一下ICMP(Internet Control Message Protocol),它是检测传输网络是否通畅、主机是否可达、路由是否可用等网络运行状态的协议。ICMP 虽然并不传输用户数据,但是对评估网络健康状态非常重要,经常使用的ping、tracert 命令就是基于ICMP 检测网络状态的有力工具。图1-16中TTL 右侧是挂载协议标识,表示IP 数据包里放置的子数据包协议类型,如6代表TCP、17 代表UDP 等。
IP 报文在互联网上传输时,可能要经历多个物理网络,才能从源主机到达目标主机。比如在手机上给某个PC 端的朋友发送一个信息,经过无线网的IEEE 802.1x认证,转到光纤通信上,然后进入内部企业网802.3,并最终到达目标PC。由于不同硬件的物理特性不同,对数据帧的最大长度都有不同的限制,这个最大长度被称为最大传输单元,即MTU(Maximum Transmission Unit)。那么在不同的物理网之间就可能需要对IP 报文进行分片,这个工作通常由路由器负责完成。
IP 是TCP/IP 的基石,几乎所有其他协议都建立在IP 所提供的服务基础上进行传输,其中包括在实际应用中用于传输稳定有序数据的TCP。