本文整理OSI参考模型
、TCP/IP协议
、Socket
。
OSI参考模型
OSI参考模型
的全称是开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM)
,它是由国际标准化组织ISO提出的一个网络系统互连模型,它是网络技术的基础,也是分析、评判各种网络技术的依据,模型如下。
OSI参考模型
把网络通信的工作分为七层,一至四层被认为是低层,这些层与数据移动密切相关,五至七层是高层,包含应用程序级的数据,每一层负责一项具体工作,然后把数据传送到下一层,由低到高具体分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
TCP/IP协议
国际标准化组织ISO制定的OSI参考模型
过于庞大、复杂,招致了许多批评,它是一个参考模型,TCP/IP协议
则是事实上的标准,TCP/IP协议
参考了OSI参考模型
,它并没有严格按照OSI规定的七层去划分,只划分了四层。
TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网间协议)
定义了主机如何连入因特网以及数据如何在它们之间传输的标准,从字面意思来看,TCP/IP协议
是TCP协议
和IP协议
的合称,实际上,TCP/IP协议
是指TCP/IP协议族
。每一层协议建立在低一层提供的服务之上,并为更高一层提供服务,如下所示。
- 应用层,面向不同的网络应用引入了不同的应用层协议。基于
TCP协议
,如文件传输协议(File Transfer Protocol,FTP)
、虚拟终端协议(TELNET)
、超文本链接协议(Hyper Text Transfer Protocol,HTTP)
,也有基于UDP协议
- 传输层,使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议,
传输控制协议TCP(transmission control protocol)
、用户数据报协议UDP(user datagram protocol)
。TCP协议
是一个面向连接、可靠的协议,它将一台主机发出的字节流无差错的发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段传递给下层,在接收端,它负责把收到的报文进行重组后递交给上层,TCP协议
还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。UDP协议
是一个不可靠、无连接的协议,主要适用于不需要对报文进行排序和流量控制的场合 - 网络层,把分组发往目标网络或主机。为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。网络层定义了分组格式和协议,即
IP协议(Internet Protocol)
。网络层除了需要完成路由功能,也可以完成将不同类型的网络(异构网)互连的任务,除此之外,还需完成拥塞控制的功能 - 数据链路层/网络接口层,
TCP/IP协议
并未真正描述这一层的实现,只是要求能够提供给其上一层——网络层——一个访问接口,以便在其上面传递IP分组
TCP/IP协议
和OSI参考模型
并不冲突,TCP/IP协议
中的应用层协议对应于OSI参考模型
中的应用层、表示层、会话层,同时将OSI参考模型
中的数据链路层和物理层合并为网络接口层。
IP报文格式
IP协议
是TCP/IP协议族
中最核心的协议,它提供不可靠、无连接的服务,依赖于其他层的协议进行差错控制。在局域网环境,IP协议
往往被封装在以太网帧中传送,所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送,TCP/IP报文封装、IP头部格式分别如下所示。
- 版本(Version)字段:占4比特。用来表明
IP协议
实现的版本号,当前一般为ipv4,即0100 - 报头长度(Internet Header Length,IHL)字段:占4比特
- 服务类型(Type of Service,TOS)字段:占8比特
- 总长度字段:占16比特。指明整个数据报的长度(以字节为单位)
- 标志字段:占16比特。用来唯一的标识主机发送的每一份数据报,通常每发一份报文,值会加一
- 标志位字段:占3比特。标志一份数据报是否要求分段
- 段偏移字段:占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置
- 生存期(Time to Live,TTL)字段:占8比特。用来设置数据报最多可以经过的路由器数,由发送数据的源主机设置,通常为32、64、128等,每经过一个路由器,其值减1,直到0时该数据报被丢弃
- 协议字段:占8比特。指明
IP协议
所封装的上层协议类型,如ICMP(1)、IGMP(2)、TCP(6)、UDP(17)等 - 头部校验和字段:占16比特
- 源IP地址、目标IP地址字段:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址
- 可选项字段:占32比特。用来定义一些任选项,如记录路径、时间戳等
TCP数据段格式
TCP协议
是一种可靠的、面向连接的字节流服务,源主机在传送数据前需要先和目标主机建立连接,然后,在此连接上被编号的数据段按序收发,同时,要求对每个数据段进行确认以保证可靠性,如果在指定时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段,TCP头部结构如下所示。
- 源、目标端口号字段:各占16比特。
TCP协议
通过使用端口来标识源端和目标端的应用进程,端口号可以使用0到65535之间的任意数字,在收到服务请求时,操作系统动态的为客户端应用程序分配端口号,在服务器端,每种服务在众所周知的端口(Well-Know Port)为用户提供服务 - 顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,表示在这个报文段中的第一个数据字节
- 确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效,它包含目标端所期望收到源端的下一个数据字节
- 头部长度字段:占4比特
- 保留字段:占6比特
- 标志位字段(U、A、P、R、S、F):占6比特,各比特含义:URG——紧急指针(urgent pointer)有效,ACK——确认序号有效,PSH——接收方应该尽快将这个报文段交给应用层,RST——重建连接,SYN——发起一个连接,FIN——释放一个连接
- 窗口大小字段:占16比特。此字段用来进行流量控制,单位为字节数,值是本机期望一次接收的字节数
- TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据,进行校验和计算,由目标端进行验证
- 紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号
- 选项字段:占32比特。可能包括窗口扩大因子、时间戳等选项
UDP数据段格式
UDP是一种不可靠、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接,数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机,此时每个数据段的可靠性依靠上层协议来保证,在传送数据较少、较小的情况下,UDP比TCP更加高效,UDP头部结构如下所示。
- 源、目标端口号字段:各占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程
- 长度字段:占16比特。标明UDP头部和UDP数据的总长度字节
- 校验和字段:占16比特。用来对UDP头部和UDP数据进行校验,和TCP不同的是,UDP中此字段是可选项,而TCP数据段中的校验和字段是必须
Socket
在每个TCP、UDP数据段中都包含源端口和目标端口,把一个IP地址和一个端口号合称为一个Socket(套接字)
,而一个Socket Pair(套接字对)
可以唯一确定互连网络中每个TCP连接的双方,常见协议及对应服务端口号如下所示。
Socket
是通信的基石,是支持TCP/IP协议
网络通信的基本操作单元,它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址、远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据,为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议
交互提供Socket接口
。应用层与传输层可以通过Socket接口
,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务,如下所示。
建立Socket连接
建立Socket连接
至少需要一个Socket Pair
,其中一个运行于客户端,称为Client Socket
,另一个运行于服务器端,称为Server Socket
。套接字之间的连接过程分为三个步骤:服务器监听、客户端请求、连接确认。
- 服务器监听,服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求
- 客户端请求,是指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字,为此客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
- 连接确认,当服务器端套接字监听到或者接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
创建Socket连接
时,可以指定使用的传输层协议,Socket
支持不同的传输层协议(TCP或UDP),当使用TCP协议
进行连接时,该Socket连接
就是一个TCP连接
。
三次握手
建立起一个TCP连接需要经过三次握手,三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小),并建立逻辑连接,三次握手的过程如下所示。
- 客户端发送SYN包到服务器,SYN=j,并进入SYN_SEND状态,等待服务器确认
- 服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时向客户端发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
- 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态
握手过程传送的包中不包含数据,在三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时,服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过四次握手(服务器和客户端交互,最终确定断开)