关于”TCP直接返回“

LVS里面的direct返回特性很有意思,要是也能够用于微服务架构的话,后端的负载均衡可能就完全不是问题了。


 LVS的“直接返回”需要特殊的配置(可参考《Linux就是这个范儿》),TCP的连接状态是在Linux内核中维护的,要实现从另外一个节点直接返回结果,估计需要复制TCP连接状态

 TCP本来是有连接的流协议,但大部分消息通信系统都实现了基于TCP单连接的多工二进制传输,比如SPDY/HTTP2,这本身感觉就不很匹配?但是UDP在WAN上的单个数据包有效载荷又太小了

 即使能够实现“TCP直接返回”,这仍然需要一个虚拟局域网的集群,集群外面仍然是个路由器(单点故障),但是路由器的吞吐量一般好于前端分发/反向代理服务器

### Java 中 TCP 和 UDP 的面试常见问题及解答 #### 一、TCP 和 UDP 的基本概念 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的传输层协议。TCP 是面向连接的可靠协议,而 UDP 则是非面向连接的不可靠协议[^3]。 - **TCP 特点** 提供可靠的字节流服务,通过三次握手建立连接,四次挥手断开连接。适用于需要高可靠性场景下的数据传输[^4]。 - **UDP 特点** 不提供确认机制,速度快但可能会丢失数据包或乱序到达。适合实时性强的应用场景,如音视频通话。 --- #### 二、TCP 和 UDP 的主要区别 | 对比项 | TCP | UDP | |----------------|------------------------------------|----------------------------------| | 连接方式 | 面向连接 | 非面向连接 | | 可靠性 | 高度可靠 | 不可靠 | | 数据单位 | 字节流 | 数据报 | | 应用场景 | 文件下载、邮件收发 | 实时语音聊天、在线游戏 | | 开销 | 较大 | 较小 | 上述表格展示了两者的主要差异。 --- #### 三、TCP 的三次握手与四次挥手过程 ##### 1. 三次握手 - 客户端发送 SYN 请求至服务器; - 服务器收到后返回 ACK 并带上自己的 SYN; - 客户端再次发送 ACK 给服务器完成握手。 ```python # Python 示例:创建一个简单的 TCP Server import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8080)) server_socket.listen(5) print("Server is listening...") client_socket, addr = server_socket.accept() data = client_socket.recv(1024).decode('utf-8') print(f"Received data: {data}") client_socket.close() ``` ##### 2. 四次挥手 - 主动方发送 FIN 表示不再发送数据; - 被动方回复 ACK 确认; - 被动方随后也发送 FIN; - 主动方最终回复 ACK 结束连接。 --- #### 四、UDP 的应用场景及其特点 由于 UDP 缺乏重传机制,在某些特定场合下却能发挥重要作用。例如直播平台为了追求流畅体验允许少量丢帧现象存在;DNS 查询通常采用该种方式进行快速响应。 --- #### 五、Socket 编程基础 无论是基于哪种协议实现通信功能都需要借助 Socket API 来完成实际操作流程描述如下: 1. 创建套接字对象实例化相应类; 2. 如果是服务端还需要绑定地址信息以及进入监听状态等待接入请求到来; 3. 接受来自远端主机发起的新链接或者直接发送消息过去; 4. 执行具体业务逻辑处理完毕之后记得释放资源关闭所有打开过的文件句柄等等。 ```java // Java 示例:简单 UDP Client 发送消息 import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPSender { public static void main(String[] args) throws Exception { String message = "Hello from UDP!"; byte[] sendData = message.getBytes(); DatagramSocket udpSocket = new DatagramSocket(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("localhost"), 9876); udpSocket.send(sendPacket); udpSocket.close(); } } ``` --- ### 总结 通过对以上内容的学习可以发现掌握好这两者之间本质上的不同之处有助于我们更好地理解计算机网络工作原理从而提高解决实际工程难题的能力水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值