1.程序之间的通信
两个应用程序之间的通信,我们可以理解为进程之间的通信,而进程之间进行通信的前提是我们能够找到某个进程,因此,我们需要给进程添加唯一的标示,在本地进程通信中我们可以使用PID来标示一个进程,但PID只在本地唯一,网络中的多个计算机之间的进程标示并不能保证唯一性,冲突的几率很大,这时候我们需要另辟蹊径,TCP/IP协议族已为我们解决了这个问题,IP层的ip地址可以标示主机,而TCP层协议和端口号可以标示某个主机的某个进程,于是我们采取“ip地址+协议+端口号”作为唯一标示的这种形式,来确定网络中的一个进程,从而进行进程之间的通讯,这种方式就是我们Socket使用的通讯方式。
2.网络模型
如果没有网络编程基础的话,相信大家看到上面描述的TCP/IP已经是懵懵哒,那么现在我们需要一步一步的了解,首先来介绍一下什么是网络模型。
2.1OSI参考模型
OSI参考模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。
OSI参考模型将整个通信功能划分为七个层次,分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。
- 物理层(Physical Layer):物理层是OSI参考模型的最低层,它利用传输介质为数据链路层提供物理连接。它主要关心的是通过物理链路从一个节点向另一个节点传送比特流,物理链路可能是铜线、卫星、微波或其他的通讯媒介。(由底层网络定义协议)
- 数据链路层(Link):数据链路层是为网络层提供服务的,解决两个相邻结点之间的通信问题,传送的协议数据单元称为数据帧。主要功能为:建立逻辑连接、进行硬件地址寻址、差错效验等。(由底层网络定义协议)
- 网络层(Network):网络层是为传输层提供服务的,传送的协议数据单元称为数据包或分组。该层的主要作用是解决如何使数据包通过各结点传送的问题,即通过路径选择算法(路由)将数据包送到目的地。另外,为避免通信子网中出现过多的数据包而造成网络阻塞,需要对流入的数据包数量进行控制(拥塞控制)。当数据包要跨越多个通信子网才能到达目的地时,还要解决网际互连的问题。协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
- 传输层(Transport):传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。传输层传送的协议数据单元称为段或报文。 协议有:TCP UDP
- 会话层(Session Layer):会话层主要功能是管理和协调不同主机上各种进程之间的通信(对话),即负责建立、管理和终止应用程序之间的会话。会话层得名的原因是它很类似于两个实体间的会话概念。例如,一个交互的用户会话以登录到计算机开始,以注销结束。
- 表示层(Presentation Layer):表示层处理流经结点的数据编码的表示方式问题,以保证一个系统应用层发出的信息可被另一系统的应用层读出。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据表示格式转换成网络通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功。
- 应用层(Application):应用层是OSI参考模型的最高层,是用户与网络的接口。该层通过应用程序来完成网络用户的应用需求,如文件传输、收发电子邮件等。协议有:HTTP FTP TFTP SMTP SNMP DNS
2.2TCP/IP参考模型
TCP/IP参考模型(TCP/IP
Reference Model)是计算机网络的祖父ARPANET和其后继的因特网使用的参考模型。TCP/IP并不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族(包含很多种协议)。
TCP/IP参考模型并不完全符合OSI的七层参考模型,用了4层的层级结构,分别为:网络接口层、网络层、传输层、应用层。每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 网络接口层(即主机-网络层):网络接口层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
- 网际互联层:网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
IP协议:是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。
- 传输层:传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
- 应用层:应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.
OSI模型是在协议开发前设计的,抽象能力高,适合与描述各种网络,具有通用性;TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络。OSI参考模型的概念划分清晰,但过于复杂;而TCP/IP参考模型在服务、接口和协议的 区别上不清楚,功能描述和实现细节混在一起。OSI参考模型虽然被看好,由于没把握好时机,技术不成熟,实现困难;相反,TCP/IP参考模型虽然有许多不尽人意的地方,但还是比较成功的。
3.TCP /UDP
3.1TCP传输控制协议
提供的是一种面向连接、可靠(保证数据正确性,保证数据顺序)的数据传输服务,位于OSI参考模型中的传输层,用于传输大量数据(流模式),缺点是速度慢,建立连接需要开销较多(时间,系统资源)。
TCP建立连接和断开连接的过程非常有名,分别为三次握手和四次挥手,首先我们需要了解这两个过程涉及到的一些专业词汇:
- 报文(message):是网络中交换与传输的数据单元,即一次性要发送的数据块,包含了将要发送的完整的数据信息,会不断的封装成分组、包、帧来传输。
- TCP报文格式:
从上图我们可以看出TCP报文格式非常复杂,这里面我们关注的是序号,确认号,及标志位(标志位共六种,这里我们只一下介绍涉及到的SYN,ACK,FIN):
- SYN:TCP报文中标志位中的同步标志,表示建立连接。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,SYN置1就表示这是一个连接请求或连接接受报文。
- ACK:TCP报文中标志位中的确认标志,表示确认序号有效,用作响应。TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
- FIN:TCP报文中标志位中的结束标志,表示关闭连接。当FIN=1时,表明发送方的数据已经发送完毕,并要求释放连接。
- seq:Sequence number(顺序号码),即序号。
- ack number:Acknowledge number(确认号),只有ACK标志位为1时,确认序号字段才有效。
TCP三次握手:
所谓三次握手(Three-way Handshake),是指客户端和服务器之间建立连接的过程。
第一次握手:Client发送位码为 SYN = 1,随机产生 seq = x 的数据包到服务器,Server由 SYN = 1 知道Client要求建立连接;
第二次握手:Server收到请求后要确认连接信息,向Client发送ack number = x + 1 (ps: Client的seq + 1),SYN = 1,ACK=1,随机产生 seq = y 的包;
第三次握手:Client收到后检查ack number是否正确,即第一次发送的 seq + 1,以及位码ACK是否为1,若正确,Client会再发送 ack number = y + 1 (ps: Sever的seq + 1),ACK = 1,Server收到后确认seq值与 ACK = 1 则连接建立成功。
完成三次握手,Client与Server开始传送数据。
TCP四次挥手:
所谓四次挥手(four-way handshake),是指客户端和服务器之间解除连接状态的过程。
第一次挥手:主动方发送位码为 FIN = 1,随机产生 seq = u 的数据包到服务器,用来关闭主动方到被动方的数据传送。
第二次挥手:被动方收到这个FIN报文,它回复一个ACK进行确认响应,并设置确认序号ack number为收到的seq + 1,即ack number = u + 1。注意此时的回复并没有包含FIN,因为第一次挥手过程只代表主动方没有数据发送给被动方(主动方还可以接收数据),但不代表被动方所有数据已全部发送完成,所以被动方未必就需要马上关闭连接,是可以继续发送数据的,当被动方再次发送FIN报文时(第三次握手),表示被动方同意关闭连接。
第三次挥手:被动方关闭与主动方的连接,发送一个FIN给主动方。
第四次挥手:主动方回复ACK报文确认,并将确认序号ack number设置为seq + 1,即ack number = w + 1。
3.2UDP用户数据报协议
是一种面向非连接、不保证可靠的数据传输服务,位于OSI参考模型中的传输层,用于传输少量数据(数据包模式)、速度快。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
4.Socket通信
Socket(套接字)时在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,也就是说,我们并不能直接使用运输层的东西,而是通过使用Socket提供的API去间接使用。