我正在根据教程构建自己的网络服务器。 我找到了一种简单的方法来启动TCP连接并发送一段http数据(网络服务器将在微控制器上运行,因此它将非常小)
无论如何,以下是我需要经历的顺序:
收到SYN
发送SYN,ACK
收到ACK(现已建立连接)
使用HTTP GET命令
发送确认
使用HTTP数据发送FIN,ACK(例如200 OK)
收到FIN,ACK< - 我没收到这个包!
发送确认
一切正常,直到我发送确认和HTTP 200 OK消息。 客户端不会向这两个包发送确认,因此 没有显示任何网页。 我添加了一个pcap文件的序列,我用wireshark记录它。
Pcap文件:http://cl.ly/5f5/httpdump2.pcap
所有序列和确认号都正确,校验和正常。旗帜也是对的。 我不知道出了什么问题。
答案 0 :(得分:1)
我认为第6步应该只是FIN,没有ACK。来自客户端的数据包是你在那个地方确认的?另外我不明白为什么4.应该是ACK而不仅仅是正常的数据包 - 客户端在3处确认连接。
关于TCP状态的This图可能会有所帮助。
答案 1 :(得分:0)
WireShark说(FIN数据包):
TCP TCP断开:确认字段为 非标志未设置
时非零
我不确定是什么导致了您的问题,但如果WireShark不喜欢该数据包,也许客户端也不喜欢。因此,它应该是FIN + ACK,或者您应该将确认字段设置为0。
如果这不能解决问题,您可能还会先尝试发送数据,然后再单独发送FIN数据包。将数据包含在FIN中是有效的,但更常见的是自己发送FIN(如前面发布的其他pcap跟踪中所示)。
此外,您可能应该使用200 OK
最后,我没有看到FIN数据包的任何重传尝试 - 是因为你立即停止了捕获?
答案 2 :(得分:0)
IP长度字段因此过多计数8位。我的计算错了。 Everythings现在就像一个魅力!