ws+socket.io 精读Websocket原理大全需知,以及具体使用( 三 )


另外一点,长连接并不是永久连接的 。如果一段时间内(具体时间可以在header中进行设置,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉 。

注意:因为HTTP1.1协议以后,连接默认都是长连接 。没有短连接说法(HTTP1.0默认使用短连接),网上大多数指的长短连接实质上说的就是TCP连接 。
2.5.4 短连接指通信双方有数据交互时,建立一个TCP连接,数据发送完成之后,则断开此连接 。连接过程: 建立连接——数据传输——断开连接——…——建立连接——数据传输——断开连接
目前 http 协议普遍使用的是 1.1 版本, 之前有个 1.0 版本,两者之间的一个区别是 1.1 支持 http 长连接
http1.0 不支持 http 长连接, 每次一个 http请求响应后都关闭 tcp 连接, 下个 http 请求会重新建立 tcp 连接.
2.5.5 通讯概念
  • 单工 数据传输的方向唯一,只能由发送方向接收方的单一固定方向传输数据 。
  • 半双工 即通信双方既是接收方也是发送方,不过,在某一时刻只能允许向一个方向传输数据 。
  • 全双工: 即通信双方既是接收方也是发送方,两端设备可以同时发送和接收数据 。
单工、半双工和全双工 这三者都是建立在 TCP协议(传输层上)的概念,不要与应用层进行混淆 。
三、HTTP与TCP的区别和联系3.1、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连接的请求,断开过程需要经过“四次握手”(过程就不细写 了,就是服务器和客户端交互,最终确定断开)
3.2、HTTP连接HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用 。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接 。从建立连接到关闭连接的过程称为“一次连接” 。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接 。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求 。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求 。通常的 做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客 户端“在线” 。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开 。
  • TCP是底层通讯协议,定义的是数据传输和连接方式的规范
  • HTTP是应用层协议,定义的是传输数据的内容的规范
  • HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
  • HTTP支持的是www服务 ;
  • 而TCP/IP是协议是Internet国际互联网络的基础 。TCP/IP是网络中使用的基本的通信协议 。
四、nodejs创建web服务器和Tcp服务器4.1 使用Express创建Web服务器var express = require('express');var App = express();app.use(express.static('./public'))app.get('/',(req,res,next)=>{res.end('hello');next(); // 进行下一步,打印日志 })//Router方法 适合某一个模块下的多个子路由var Router = express.Router();Router.get('/add',(req,res)=>{res.end('add')})Router.get('/list',(req,res)=>{res.end('list')})app.use('/post', Router)//route方法适合restful APIapp.route('/article').get((req,res)=>{res.end('/article get')}).post((req,res)=>{res.end('/article post')})app.get('/news/:newsId', (req, res)=>{req.end('newsId:' + req.newsId);})app.listen(18001, function afterLister(){console.log('服务再次启动')})复制代码


推荐阅读