先说一下网络的层级:由下往上分为 物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
1、TCP和UDP
TCP:是面向连接的一种传输控制协议。属于传输层协议。TCP连接之后,客户端和服务器可以互相发送和接收消息,在客户端或者服务器没有主动断开之前,连接一直存在属于长连接。
优点:安全、传输数据无大小限制、准确可靠,先发先至
缺点:效率低,不能做离线任务、连接有耗时
UDP:是面向非连接的用户数据报协议。属于传输层协议。所谓的无连接就是在传输数据之前不需要交换信息,没有握手建立连接的过程,只需要直接将对应的数据发送到指定的地址和端口就行。
例:我不管你要不要,我就一直发给你。就好比QQ消息一样,当你离线的时候仍然可以收到消息
优点:可以传输大文件,速度快,效率高
缺点:不安全,容易丢包(数据)、先发未必先至
补充:
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连接的请求,断开过程需要经过“四次握手”
因为当A给B发送消息时,只有B同意了才能传输。由此可以看出HTTP协议是基于TCP的。因为当你在向后台请求数据的时候,后台必须同意,你才可以请求,否则都是白扯
2、HTTP
HTTP是基于TCP协议的应用的超文本传输协议,属于应用层的协议。请求时需建立TCP连接,请求结束后断开连接,完成一次请求/响应操作。
HTTP协议永远都是客户端发起请求,服务器回送响应,这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
优点:基于应用级的接口使用方便
缺点:(1)传输速度慢,数据包大。(2)如实现实时交互,服务器性能压力大。(3)数据传输安全性差
注意:服务器不会主动给客户端发送数据。
3、Socket
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)
Socket连接需要一对套接字,一个运行于客户端,另一个运行于服务端!之间的连接分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是由客户端的套接字提出连接请求,要连接的目标是服务端的套接字。所以客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
4、WebSocket
虽然叫WebSocket,但它与Socket没有任何关系。就好比:Java与JavaScript,雷锋与雷峰塔,印度与印度尼西亚,黑客与博客的关系,两者没有任何关系!
WebSocket也是一种协议,并且也是基于TCP协议的。可以理解为WebSocket是HTTP的优化,但WebSocket不仅仅在Web应用程序上得到支持。
WebSocket虽然是Html5的产物,但也不仅仅局限于浏览器的应用程序,许多语言都提供了WebSocket的支持,比如C,C++,Python等
WebSocket连接仿佛与什么心跳有关,我也不太了解心跳是什么玩意!等以后了解了在做补充吧!