Android网络接口 Socket 套接字通信

http,socket,tcp/ip 网络传输与通讯

TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。

使用TCP还是UDP,那要看你的程序注重哪一个方面,可靠(tcp)还是快速(udp)。

1.TCP是面向链接的,TCP的三次握手在最低限度上保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2.也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。


TCP/IP建立连接的过程 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状态,完成三次握手。

所谓的三次握手就是要有三次连接信息的发送/接收过程。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据

三次握手实质上就相当于是下列的对话:

-客户机:服务器,我想要和你建立连接,你同意吗?(SYN=1)

-服务器:客户机,我同意和你建立连接(ACK=1);我也想和你建立连接,你同意吗?(SYN=1)

-客户机:服务器,我同意和你建立连接。(ACK=1)

四次挥手实质上就相当于是下列的对话:

-客户机:服务器,我想和你断开连接,你同意吗?(FIN=1)

-服务器:我同意(ACK=1)(在此期间,服务器可能还会向客户机发送数据,但是客户机却不能再向服务器发送数据)

-服务器:客户机,我想要和你断开连接,你同意吗?(FIN=1)

-客户机:我同意。(ACK=1)


HTTP连接

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”


SOCKET原理

套接字(SOCKET)概念

socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象


建立SOCKET连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。


1.)服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2.)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3.)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。


SOCKET连接与TCP/IP连接

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

SOCKET连接与HTTP连接

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。

若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;

若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端。

因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

TCP/IP的工作原理:TCP/IP协议采用4层结构,分别是应用层、传输层、网络层和链路层

物理介质:常见的有光纤、双绞线,以及无线电波,网络通讯信的桥梁

网络通信就是把有特定意义的数据通过物理介质传送给对方,单纯的发送0和1是没有意义的,因此就需要对0和1进行分组,并且要标识好每一组电信号的信息特征,然后按照分组的顺序依次发送。

链路层:以太网协议:电信号数据包传递即为一帧包括MAC地址,类型;数据;数据帧校验序列。有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,读取首部里的目标MAC地址和自己的MAC地址匹配,相同处理,不同丢弃。

网络层:IP协议 :MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网。因此,网络层引入了IP协议,制定了一套新地址做区分。也就是所谓的IP地址,为了判断IP地址中的网络地址,IP协议还引入了子网掩码,通过子网掩码对两个IP地址进行AND运算后就能够判断双方是否在同一个子网了。

网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。

传输层:链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。怎么接收呢?个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,根据端口号可以找到对应的应用程序(socket扩展)。 为了保证传输的可靠性,TCP协议建立了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方建立可靠的连接。

总结一下,传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。

应用层:有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。因此,应用层定义了各种各样的协议来规范数据格式,常见的有http,ftp,smtp等,http是一种比较常用的应用层协议 。在请求Header中,分别定义了请求数据格式Accept 和 响应数据格式Content-Type,有了这个规范以后,当对方接收到请求以后就知道该用什么格式来解析,然后对请求进行处理就可以看到接收的数据信息。

首先我们梳理一下每层模型的职责:

•链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;

•网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;

•传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;

•应用层:定义数据格式,并按照对应的格式解读数据。

你可能感兴趣的:(Android网络接口 Socket 套接字通信)