【发布时间】:2017-01-05 17:00:27
【问题描述】:
作为一名网络工程师,我对 TCP 操作非常熟悉。作为一名程序员,我涉足过套接字编程,但从未编写过任何生产服务。
我们有一个与 PTZ(平移/倾斜/变焦)摄像机集成的供应商系统。摄像机观察病人。相机数据被馈送到供应商服务器。供应商服务器将相机数据中继给客户端。 (它做得更多,但这是简单的情况。)如果客户端想要调整相机,客户端将自定义命令发送到供应商服务器上的自定义服务。服务器解释命令并将其发送到相机。相机移动。
我们遇到了服务器上的 PTZ 服务崩溃的问题。在测试过程中,通过网络捕获,我们发现服务在nmap 执行半开(胚胎)连接时崩溃了——nmap 发送了 SYN,服务器回复了 SYN/ACK,nmap 没有发送最终的 ACK。服务器发送重复的 SYN/ACK 以尝试完成会话并失败。
我想了解的是:服务使用listen 来监视TCP 连接,然后使用accept 来接受连接。在什么时候listen 告诉服务有一个新的连接,准备好accepted? TCP 连接是否需要在listen 将其传递给服务以成为accepted 之前完成?还是服务器只需要在listen 告诉服务之前返回一个SYN/ACK?
如果握手需要在listen 告诉服务之前完成——SYN、SYN/ACK、ACK,那么我可能走错了路。如果套接字只需要获得 SYN/ACK,则服务处理不完整会话可能存在问题。其他测试,我们完成一个 TCP 会话并发送虚假数据试图让服务崩溃——并没有导致服务失败。但是重复的nmap 测试相当可靠地崩溃了,所以我倾向于半开连接问题。
【问题讨论】:
标签: sockets tcp winsock listen