短链接和长连接

作者:郭无心
链接:https://www.zhihu.com/question/22677800/answer/63806275
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

短连接
连接->传输数据->关闭连接
比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
具体就是 浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socket.close方法
->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。

也可以这样说:短连接是指SOCKET连接后,发送接收完数据后马上断开连接。
因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

长连接
连接->传输数据->保持连接 -> 传输数据-> ...........->直到一方关闭连接,多是客户端关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

HTTP在短链接和长连接上的选择:

HTTP是无状态的 ,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话

HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的HTTP1.1 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。

什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

总之,长连接和短连接的选择要视情况而定。

具体网络中的应用的话

http 1.0一般就指短连接,smtp,pop3,telnet这种就可以认为是长连接。一般的网络游戏应用都是长连接

转载于:https://my.oschina.net/zhaoxiaohuan/blog/1820257

长连接短链接的配置方式取决于使用的协议框架,以下是一些常见的配置方法: --- ### 一、HTTP 协议中的长连接配置(Keep-Alive) 在 HTTP/1.1 中,默认使用长连接,可以通过以下方式配置: #### 1. **客户端(如浏览器)或服务器(如 Nginx、Apache)配置** - **请求头设置**: ```http Connection: keep-alive ``` - **服务器响应头设置**: ```http Connection: keep-alive Keep-Alive: timeout=5, max=100 ``` - `timeout=5`:连接空闲5秒后关闭。 - `max=100`:该连接最多处理100次请求后关闭。 #### 2. **Nginx 配置示例** ```nginx http { upstream backend { server 127.0.0.1:8080; } server { listen 80; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ''; proxy_set_header Keep-Alive 'timeout=60s'; proxy_buffering off; } } } ``` --- ### 二、TCP 长连接配置(如 Socket 编程) 在 TCP 套接字编程中,长连接需要手动管理。 #### 1. **服务端配置示例(Python)** ```python import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', 8888)) server.listen(5) while True: client_socket, addr = server.accept() print(f"Connected by {addr}") while True: data = client_socket.recv(1024) if not data: break print("Received:", data.decode()) client_socket.close() ``` #### 2. **客户端配置** ```python import socket import time client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8888)) for i in range(5): client.sendall(b"Hello Server") response = client.recv(1024) print("Server response:", response.decode()) time.sleep(1) client.close() ``` --- ### 三、短链接配置示例 短链接通常是一次请求后立即断开,例如: #### 1. **HTTP 短链接** - 客户端请求头中设置: ```http Connection: close ``` #### 2. **TCP 短链接** - 每次通信后主动关闭连接: ```python client.sendall(b"Hello") response = client.recv(1024) client.close() ``` --- ### 四、WebSocket 长连接配置(基于 HTTP 升级) #### 1. **客户端** ```javascript const socket = new WebSocket('ws://example.com/socket'); socket.onopen = () => { socket.send('Hello Server'); }; socket.onmessage = (event) => { console.log('Received:', event.data); }; ``` #### 2. **服务端(Node.js + ws 库)** ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('Client connected'); ws.on('message', (message) => { console.log('Received:', message); ws.send(`Echo: ${message}`); }); }); ``` --- ### 总结配置要点: - **长连接**:保持连接、设置超时、心跳机制(如 `ping/pong`)。 - **短链接**:每次通信后关闭连接,适合一次性请求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值