什么会导致数据写入Windows上的TCP套接字在传输之前被改变?

有些东西正在改变写在Windows(Windows 7)计算机上的TCP套接字上的数据 – 具体来说,当字节遵循特定的HTTP POST模式时,当从相应的连接的监听器套接字侧读取字节时,重复该模式。

以下字节写入客户端套接字(注意:每行以一个回车符和一个换行符结尾,两个非空行后跟两个空行):

POST / HTTP/1.1 Transfer-Encoding: chunked 

从监听套接字读取什么是:

 POST / HTTP/1.1 Transfer-Encoding: chunked POST / HTTP/1.1 Transfer-Encoding: chunked 

我已经在我的机器上的回环(127.0.0.1)地址上testing了这个,但是当侦听器套接字位于另一台机器上时,我也看到了修改的字节,所以看起来字节在客户端被修改了。 我已经在我的机器上使用netcat和一个java程序(见下面)重现了这个问题,所以问题似乎在TCP堆栈中。 我只能通过一组特定的HTTP头文件来引起它,所以看起来有些东西正在对我的TCP通信进行深度数据包检查并对其进行修改。 如果我稍微改变input字节(例如,它不是一个有效的HTTP请求,例如,将“POST”更改为“QOST”,它可以正常工作)。

下面是我写的一个java程序,演示了这个和它的输出:

 import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.Charset; public final class Main { private static final String PAYLOAD = "POST / HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "\r\n" ; private static final int PORT = 8080; public static final void main(final String[] args) throws Exception { final Thread serverThread = new Thread(new Server()); serverThread.start(); final byte[] payloadBytes = PAYLOAD.getBytes(Charset.forName("UTF-8")); int i = 0; try (final Socket socket = new Socket(InetAddress.getLoopbackAddress(), PORT)) { socket.setTcpNoDelay(true); final OutputStream os = socket.getOutputStream(); for (final byte byteValue : payloadBytes) { os.write(byteValue); os.flush(); i++; } } serverThread.join(); System.out.println("bytes written: " + i); } private static final class Server implements Runnable { @Override public void run() { try (final ServerSocket serverSocket = new ServerSocket(PORT)) { // while (true) { final Socket socket = serverSocket.accept(); socket.setTcpNoDelay(true); try (final InputStream is = socket.getInputStream()) { int i = 0; int byteValue; while ((byteValue = is.read()) >= 0) { System.out.print((char) byteValue); System.out.flush(); i++; } System.out.println("----------------"); System.out.println("bytes read: " + i); } // } } catch (final Exception e) { throw new RuntimeException(e); } } } } 

输出:

 POST / HTTP/1.1 Transfer-Encoding: chunked POST / HTTP/1.1 Transfer-Encoding: chunked ---------------- bytes read: 96 bytes written: 49 

下面是在Windows上使用netcat(cygwin的nc.exe)进行的相同的testing(注意:文件test_payload.blob包含如上所述的字节,并从java程序中的PAYLOAD常量派生):

启动nc监听器:

 nc -l 8080 > nc_capture; more nc_capture 

运行nc客户端(在侦听器的另一个shell中):

 nc -v 127.0.0.1 8080 < test_payload.blob 

输出写入nc_capture:

 POST / HTTP/1.1 Transfer-Encoding: chunked POST / HTTP/1.1 Transfer-Encoding: chunked 

我的第一个想法是一个错误的防火墙,所以我禁用它,但它仍然发生。 我也尝试重置我的winsock和TCP / IP,它仍然发生。 我尝试禁用所有的networking适配器(上面的testing工作在回环IP地址,所以他们不需要),它仍然发生。 在这一点上,我几乎没有想法,我甚至不知道如何去尝试在较低的层次上进行debugging。 有没有人见过这样的事情? 是否有一些Windows上的低级诊断工具,我可以用它来查看可能有钩子到我的TCP堆栈?