<linux> Sockets:TCP/IP网络基础 学习笔记01

参考:
The Linux Programming Interface - A Linux and UNIX System Programming Handbook (by Michael KerrisK)
chapter 58 SOCKETS: FUNDAMENTALS OF TCP/IP NETWORKS

本章提供一个介绍——计算机网络概念和TCP/IP网络协议。理解这些主题对于有效使用 Internet domain sockets是必要的,这些套接字将在下一章中描述。
从本章开始,我们开始提到各种Request for Comments(RFC)文件。在本书中讨论的每个网络协议都在一个RFC中有正式的描述。我们提供关于RFCs的更进一步的信息,以及一个特别与本书涵盖的资料相关的RFC列表,位于章节53.7。

58.1 Internets

一个互联网络internetwork,或者,更普遍地,互联网internet(小写的i),连接了不同的计算机网络,允许所有网络上的主机相互通信。也就是说,一个互联网是计算机网络的网络。术语subnetwork或者subnet,被用来指代构成互联网的网络中一个网络。一个互联网的目的是隐藏不同物理网络的细节,以便向所连接网络上的所有主机呈现一个统一的网络架构。这意味着,例如,一个单一的地址格式被用来识别互联网上的所有主机。
尽管各种互联协议已经被设计出来,TCP/IP已经成为主导的协议套件,甚至取代了以前在局域网和广域网中普遍使用的专有的网络协议。这个词Internet(大写I)是指连接全球数百万台计算机的TCP/IP网络。
TCP/IP的第一个广泛的实现出现在1983年的4.2BSD中。多个TCP/IP实现直接从BSD代码派生;其它实现,包括Linux实现,是从头开始写的,并把BSD代码的operation作为一个定义TCP/IP的operation的参考标准。

TCP/IP源于美国国防部高级研究计划局(ARPA, later DARPA, with the D for Defense) 赞助的一个项目,目的是发明一个计算机网络架构由于ARPANET,一个早期的广域网络。在1970年代,为ARPANET设计了一组新的协议。准确地说,这些协议被称为DARPA互联网协议套件,但通常它们被称为TCP/IP协议套件,或者简称为TCP/IP。
网页http://www.isoc.org/internet/history/brief.shtml提供了互联网和TCP/IP的简要历史。

图58-1显示了一个简单的互联网。在这个图中,机器tekapo是路由器router的一个例子,路由器的功能是连接一个子网到另一个子网,在他们之间传输数据。除了理解正在被使用的互联网协议以外,一个路由器还必须理解它所连接的(可能)不同子网所使用的data-link-layer协议。
<linux> Sockets:TCP/IP网络基础 学习笔记01

58.2 Networking Protocols and Layers

网络协议是一组定义如何在网络上传输信息的规则。网络协议通常被组织为一系列的层,每个层建立在其下面的层上,以添加对更高层可用的特性。TCP/IP协议套件是一个分层的网络协议(如图58-2所示)。它包括互联网协议(IP)和其之上的各种协议。(实现这些不同层的代码通常被称为协议栈。)TCP/IP这个名称来源于传输控制协议(TCP)是使用最频繁的传输层协议。

我们在图58-2中省略了一系列其他TCP/IP协议,因为它们与本章无关。地址解析协议(ARP)涉及到将互联网地址映射到硬件(例如以太网)地址。The Internet Control Message Protocol (ICMP) 协议用于在网络中传递错误和控制信息。(ICMP被程序ping使用,程序ping经常被用来检查TCP/IP网络上某个特定的主机是否活跃且可见,也被traceroute使用,traceroute则用来跟踪一个IP数据包通过网络时的路径。)Internet Group Management Protocol (IGMP)被支持IP数据报的多播的主机和路由器所使用。
<linux> Sockets:TCP/IP网络基础 学习笔记01
为协议分层带来强大功能和灵活性的概念之一是透明性——每个协议层都将较高层从较低层的操作和复杂性中屏蔽出来。因此,例如,一个使用TCP的应用程序只需要使用标准的套接字API,并且知道它正在使用可靠的字节流传输服务。它不需要了解TCP操作的细节。(当我们在第61.9节看套接字选项时,我们会发现这并不一直是对的;有时,应用程序确实需要知道底层传输协议操作的一些细节。)应用程序也不需要知道IP或数据链路层的操作细节。从应用程序的角度来看,它们好像是通过套接字API直接相互通信,如图58-3所示,其中虚线表示两台主机上对应的应用程序、TCP和IP实体之间的虚拟通信路径。

Encapsulation
封装是分层网络协议的一个重要原则。如图58-4所示为在TCP/IP协议层的封装的一个例子。封装的关键思想是将从较高的层传递到较低的层的信息(例如,application data, a TCP segment, or an IP datagram)被较低的层视为不透明的数据。换句话说,下层不试图解释来自上层的信息,仅仅是将该信息放在下层使用的任何类型的数据包中,并在将数据包传递到下一层之前添加它自己的特定于该层的报头。当数据从较低的层向上传递到较高的层时,就会发生相反的解包过程。

我们没有在图58-4中显示它,但是封装的概念也延伸到数据链路层,在那里IP数据报被封装在网络帧network frames内。封装也可以扩展到应用层,在应用层中,应用程序可以执行自己的数据封装。
<linux> Sockets:TCP/IP网络基础 学习笔记01
<linux> Sockets:TCP/IP网络基础 学习笔记01

58.3 The Data-Link Layer

图58-2中最低的一层是数据链路层,它包括设备驱动程序和到底层物理介质(如电话线、同轴电缆或光纤电缆)的硬件接口(网卡)。数据链路层涉及到在网络中的物理链路上传输数据。
为了传输数据,数据链路层将来自网络层的数据报封装成称为帧frames的单元。除了要传输的数据外,每个帧还包含一个报头,例如,包含目的地地址和帧大小。数据链路层通过物理链路传输帧,并处理来自接收方的确认。(并非所有数据链接层都使用确认。)该层也可能执行错误检测、重传和流量控制。一些数据链路层也将大型网络数据包分解成多个帧,并在接收端重新组合它们。
从应用程序编程的角度来看,我们通常可以忽略数据链路层,因为所有通信细节都是在驱动程序和硬件中处理的。
数据链路层的一个特征对我们讨论IP很重要,就是最大传输单元 maximum transmission unit (MTU)。数据链路层的MTU是该层对帧大小规定的上限。不同的数据链路层有不同的MTU。

命令netstat -i显示系统的网络接口及其MTU的列表。

上一篇:Android学习系列(37)--App调试内存泄露之Context篇(下)


下一篇:购物清单