前言 : 强烈推荐W.Richard Stevens 所著的《Unix 网络编程》系列图书。另外本文有些用途是从网络引用的,出处没有考究,有些是从《Unix 网络编程 卷一》截取的。
计算机之间的通信
确却来说,是计算机之间对应的进程之间的通信。数据的交互都是在指定进程间完成的。每台计算机都运行着许许多多大大小小的进程,一台计算机中一个进程发送的交互数据需要在彼端有指定的进程接受数据。一台计算机之间的进程也可以通信,但是在不同计算机进程之间的通信是必须通过网络媒介的。最典型的例子就是客户端-服务器的通信。
计算机网络通信有两大著名模型, 即ISO/OSI七层参考模型和现在广泛应用的TCP/IP四层参考模型。
OSI(Open System Interconnection)七层模型是国际标准化组织(ISO)制定了的一套计算机互联标准,是设计和描述极端机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
图中显示一个源进程需要发送数据到目标进程的一个概要的过程。每端代表一台计算机的网络体系结构。
- 应用层 网络应用程序是面向用户的,为用户提供各种服务。我们平常用的软件就是属于应用层的,它满足客户一定的需求。
- 表示层 表示层对向上对应层服务,向下接收来自会话层的服务,表示层要完成某些特定的功能,主要有不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。
- 会话层 会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。为会话实体间建立连接、为给两个对等会话服务用户建立一个会话连接。
- 传输层 传输层建立在网络层和会话层之间,实质上它是网络体系结构中高低层之间衔接的一个接口层。传输层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。此外传输层还要具备差错恢复、流量控制等功能。
- 网络层 网络层也称通信子网层,网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。
- 数据链路层 在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。链路层的功能是实现系统实体间二进制信息块的正确传输。
- 物理层 物理层是OSI分层结构体系中最重要、最基础的一层,它建立在传输媒介基础上,实现设备之间的物理接口。
TCP/IP四层模型
ISO制定的OSI参考模型的过于庞大,相比之下TCP/IP四层参考模型简单的多。TCP/IP四层模型也是被广泛应用的模型。
可以发现四层模型把会话层、表示层的功能合并到了应用层,同时将数据链路层和物理层两者合并。当然不是简单地将它们合并,只是在层次划分上,形象的比拟出四层模型。
TCP/IP协议
在以上描述数据发送过程中,发送端数据每往下经过一层,就会为数据添加一些该层特定的报头报尾,这些数据就像一层层包裹一样打包数据;相对应的,数据打包完之后,依据物理设备将数据发送至对端,然后数据一层层往上走,每网上走一层,就会去掉该层的报头报尾,这相当于一个发送端的发方向,相当于一个解包过程。
数据经过所在层打包解包过程是依据该层的协议来的。协议,顾名思义就是双方的约定。数据传输的方式不同,用的协议就不同,数据被打成的包也就不同。
每层都有自己的协议,常接触的有应用层的是应用层协议,传输层是Tcp协议簇,网络层的是IP协议簇。每一层可用的都不止一个协议,是一簇。比如应用层的常见的协议有HTTP(HyperText Transfer Protocol超文本传输协议)、FTP(File Transfer Protocol 文件传输协议)、Telent(远程终端协议)。
(TCP协议簇)传输层的协议也不止一个,常见的有TCP(Transmission Control Protocol, 传输控制协议)、UDP(User Datagram Protocol, 用户数据报协议)以及 SCTP(Stream Control Transmission Protocol,流控制传输协议)。
TCP协议
TCP(Transmission Control Protocol, 传输控制协议),提供客户与服务器的连接,此外,它提供了可靠性,当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才会放弃重传。如此说来,TCP也不是100%的可靠协议,它提供是数据的可靠传送和故障的可靠通知。
TCP还提供可靠的流量控制。TCP总是告知对端任何时刻他一次能够从对端接受多少字节的诗句,成为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而保障发送端发送的数据不会是接收端缓冲区溢出。该窗口时刻变化,当接收到来自发送端的数据时,窗口大小减小;但当接收端从缓冲区读取数据后,窗口大小增大。
通告窗口的大小减小到0是有可能的,当TCP对用某端缓冲区已满,必须等待该端应用程序从缓冲区读取数据后,才能从对端再接收数据
TCP三次握手建立
建立TCP连接需要经过三次握手过程,所谓三次握手过程,描述如下:
- 服务器程序必须准备好接受外来的客户端的连接;
- 客户端主动连接服务端,这时客户端发送一个SYN(同步)分节,这个分节告诉服务器客户端将在(待建立的)连接中发送数据的初始序列号。通常SYN不携带用户数据。其所在的IP数据包只含有一个IP首部、TCP首部和可能有的TCP选项;
- 服务器必须确认(ACK)客户端的SYN,同时自己也要发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK;
- 客户必须确认服务器的SYN;
每个SYN的ACK的确认号就是该SYN的初始序列号+1.
TCP选项
每个SYN可以含有多个TCP选项。下面是常用的TCP选项
MISS
选项发送SYN的TCP一端使用本选项通告对端它的最大分解大小(maximum segment size)。也就是它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MISS值作为发送分节的最大大小。- 窗口规模选项 TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位,但现如今这个选项提供的最大窗口接近1GB,使用这个选项有个前提就是两端系统必须都支持这个选项。
- 时间戳选项 它可以防止由失而复现的分组可能造成的数据损坏。
TCP的终止
TCP连接的建立需要3个分节,终止一个TCP连接则需4个分节
- 某一端首先主动关闭进程,该端发送一个FIN分节,表示数据发送完毕;
- 接收到这个FIN分节的对端执行被动关闭,这个FIN由TCP确认。它的接收 也作为一个文件结束符传递给接收端应用进程,因为FIN的接收意味着接收端应用进程在连接上在没有数据可接收;
- 一段时间后,接收到这个文件结束符的应用进程关闭它的连接,导致它也发送一个FIN;
- 接收这个最终FIN的源发送端TCP确认这个FIN
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。使用限定词“通常”是因为在某些情况下,某些情形下步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭的一端,有可能被合并成一个分节。
类似SYN,一个FIN也占据一个字节的序列号空间。因此每个FIN的ACK的确认号就是这个FIN的序列号+1.