Socket的基本通信原理
- 首先socket 通信是基于TCP/IP 网络层上的一种传送方式,socket属于传输层,socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装。
- 首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。
TCP连接
-
单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播。
-
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。
-
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都 有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信,举例:电话通信。
-
手机能够使用联网功能是因为手机底层实现了TCP/IP协议。可以使手机终端通过无线网络建立TCP连接,TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在无差别的网络之上。
-
建立一个TCP连接需要三次握手:
1、第一次握手:客户端发送sys包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
2、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送了一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
3、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 -
握手过程中传输的暴力不含数据,三次握手完毕后,客户端和服务端才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中任何一方主动关闭连接之前,TCP连接都将被一直保持下去,断开连接时服务器和客户端 均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(服务器 和客户端交互,最终确定断开)
-
四次挥手
1、第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2、第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3、第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4、第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
Http连接
- Http协议即超文本传输协议,是Web联网的基础,也是手机联网常用的协议之一,http协议是建立在TCP协议之上的一种应用。
- Http连接最显著的特点是客户端发送的每次请求都需要服务器回送相应,在请求结束后,会主动释放连接,从建立连接到关闭连接的过程称之为“一次连接”。
a》在HTTP1.0中。客户端的每次请求都要建立一次单独的连接,在处理完成请求后,就自动释放连接。
b》在HTTP1.1中则可以在依次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后在发送下一个请求。 - 由于Http在么次请求结束之后都会主动释放连接,因此HTTp协议连接是一种短连接,要保持客户端程序的在线状态,需要不断的向服务器发起连接请求,通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”,若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已断开。
socket原理
-
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,他是网络通信过程中端点的抽象表示,他包含网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远程主机的IP地址,远地进程的协议端口。
-
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序提供并发服务的问题,多个TCP连接多个应用程序进程可能需要通过同一个TCP协议端口传输数据,为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(socket)接口,应用层可以和传输层通过socket接口区分来自于不同应用进程或网络连接的通信,实现数据传输的并发服务。
-
建立socket连接
建立socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行与服务器,称为ServerSocket。 -
套接字之间的连接分为三个步骤:服务器监听、客户端请求、连接确认。
-
服务器监听:服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
-
客户端请求:至客户端的套接字提出连接请求,要练级的目标是服务器端的套接字,为此客户端的套接字必须首先描述他要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后向服务器端套接字提出连接请求。
-
连接确认:当服务器端套接字监听到或者说接收到客户端的套接字连接请求是,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式链接链接,而服务器端 套接字继续处于监听状态,继续接受其他客户端套接字的连接请求。
socket连接与TCP连接
-
创建Socket连接时,可以指定使用的传输层协议,socket可以支持不同的传输层协议(TCP/UDP),当使用TCP协议进行连接时,该socket接连就是TCP链接.
-
通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,至到双方连接断开。但在实际网络应用中,客户端连接服务器之间的通信往往需要穿越多个中间节点,例如路由器,网关,防火墙等,大部分防火墙默认会关闭吃那个时间处于或活跃状态的连接而导致的Socket连接断连,因此需要轮询告诉网络,该链接处于活跃状态。
-
HTTp连接使用的是“请求一响应”的方式,不仅在请求是需要先建立连接,而且需要客户端向服务器发出请求后,服务端才能回复数据。
-
很多情况下,需要服务器端主动向客户端推送数据,保持客户端和服务器数据实时与同步,此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则需要等到客户端发送一次请求后向服务端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就传给客户端。
TCP连接与HTTP连接的区别
HTTP是基于TCP的,客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是先三次握手,“你好,你好,你好”。从HTTP 1.1开始支持持久连接,也就是一次TCP连接可以发送多次的HTTP请求。
总结:HTTP基于TCP
TCP连接与Socket连接的区别
在图中我们提到,socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于连接,也有可能基于UDP。基于TCP协议的socket连接同样需要通过三次握手建立连接,是可靠的;基于UDP协议的socket连接不需要建立连接的过程,不过对方能不能收到都会发送过去,是不可靠的,大多数的即时通讯IM都是后者。
总结:Socket也基于TCP
长连接
指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接。
短连接
短连接服务是每次请求都建立链接,交互完之后关闭链接,
长连接与短连接的优势
-
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是短连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
-
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好
HTTP连接与Socket连接的区别
-
HTTP是短连接,Socket(基于TCP协议的)是长连接。尽管HTTP1.1开始支持持久连接,但仍无法保证始终连接。而Socket连接一旦建立TCP三次握手,除非一方主动断开,否则连接状态一直保持。
-
为什么说http连接是无状态的?
(1)协议对于事务处理没有记忆能力,
(2)对同一个url请求没有上下文关系,
(3)每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况,
(4)服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器 -
HTTP连接服务端无法主动发消息,Socket连接双方请求的发送先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
-
Http连接:http连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
-
socket连接:socket连接及时所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该链接已释放网络资源。所以当一个socket连接中没有数据的传输,那么为了位置连续的连接需要发送心跳消息,具体心跳消息格式是开发者自己定义的。
什么时候该用HTTP,什么时候该用socket
-
用HTTP的情况:双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等。
-
用Socket的情况:大部分即时通讯应用(QQ、微信)、聊天室等等。
转载:https://blog.csdn.net/qq_34681580/article/details/104817571