前言 : 强烈推荐W.Richard Stevens 所著的《Unix 网络编程》系列图书。另外本文有些用途是从网络引用的,出处没有考究,有些是从《Unix 网络编程 卷一》截取的。
确却来说,是计算机之间对应的进程之间的通信。数据的交互都是在指定进程间完成的。每台计算机都运行着许许多多大大小小的进程,一台计算机中一个进程发送的交互数据需要在彼端有指定的进程接受数据。一台计算机之间的进程也可以通信,但是在不同计算机进程之间的通信是必须通过网络媒介的。最典型的例子就是客户端-服务器的通信。
计算机网络通信有两大著名模型, 即ISO/OSI七层参考模型和现在广泛应用的TCP/IP四层参考模型。
OSI(Open System Interconnection)七层模型是国际标准化组织(ISO)制定了的一套计算机互联标准,是设计和描述极端机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
图中显示一个源进程需要发送数据到目标进程的一个概要的过程。每端代表一台计算机的网络体系结构。
ISO制定的OSI参考模型的过于庞大,相比之下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(Transmission Control Protocol, 传输控制协议),提供客户与服务器的连接,此外,它提供了可靠性,当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才会放弃重传。如此说来,TCP也不是100%的可靠协议,它提供是数据的可靠传送和故障的可靠通知。
TCP还提供可靠的流量控制。TCP总是告知对端任何时刻他一次能够从对端接受多少字节的诗句,成为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而保障发送端发送的数据不会是接收端缓冲区溢出。该窗口时刻变化,当接收到来自发送端的数据时,窗口大小减小;但当接收端从缓冲区读取数据后,窗口大小增大。
通告窗口的大小减小到0是有可能的,当TCP对用某端缓冲区已满,必须等待该端应用程序从缓冲区读取数据后,才能从对端再接收数据
建立TCP连接需要经过三次握手过程,所谓三次握手过程,描述如下:
每个SYN的ACK的确认号就是该SYN的初始序列号+1.
每个SYN可以含有多个TCP选项。下面是常用的TCP选项
MISS
选项发送SYN的TCP一端使用本选项通告对端它的最大分解大小(maximum segment size)。也就是它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MISS值作为发送分节的最大大小。TCP连接的建立需要3个分节,终止一个TCP连接则需4个分节
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。使用限定词“通常”是因为在某些情况下,某些情形下步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭的一端,有可能被合并成一个分节。
类似SYN,一个FIN也占据一个字节的序列号空间。因此每个FIN的ACK的确认号就是这个FIN的序列号+1.