我目前的项目是裸机网络服务器。为此,我没有使用库,直接编程到芯片上。我现在要做的就是发送一条HTTP数据:
HTTP/1.1 200 OK\r\n
Content-Length: 45\r\n
Content-Type: text/html\r\n
Server: microserver\r\n
Connection: close\r\n
\r\n
<!DOCTYPE html><html>Hello<br>world!<hr></html>
我的服务器尝试执行以下步骤:
收到SYN
发送[SYN + ACK]
收到确认
接收包含HTTP GET的ACK
用HTTP数据发送[ACK,PUSH,FIN](这个改变很多,我尝试单独发送ACK PUSH和FIN(内容在PUSH中),尝试[ACK + PUSH],FIN和ACK,[PUSH + FIN]。
接收[ACK + FIN]&lt;&lt; ---这是错误的地方,根据wireshark的说法,它甚至都没有发送。
发送确认。
如上所述,每次都在第6步出错。无论我在步骤5中使用何种ACK,PUSH和FIN组合。使用wireshark查看时,所有的SEQ和ACK编号都是正确的。
我的服务器能够在[FIN + ACK]最终发送后关闭连接,这有时会发生在浏览器同步保持打开的套接字上。
Wirehark记录的Pcap文件:https://www.dropbox.com/s/062k9hkgkenaqij/httpdump.pcap与过滤器:(tcp.dstport == 80 || tcp.srcport == 80) && (ip.dst == 169.254.100.100 || ip.src == 169.254.100.100)
我知道有一个4岁的非常相似的问题,Building a webserver, client doesn't acknowledge HTTP 200 OK frame,但我已经尝试了那里建议的所有内容,而且它似乎没有让我更进一步,所以我'我没有想法。
编辑: 我已经找到了问题,在研究了几个小时的wirehark捕获结束后。显然,错误是我没有使用数据来计算TCP校验和......但是,找到了解决方案。