tomcat与https发送单独的数据包

时间:2015-09-03 03:35:04

标签: java apache tomcat ssl

当使用带有https的tomcat7时,我发现数据包的内容应该在一个数据包中,但它会被传输到两个数据包。 我认为ssl的设置还可以。我可以使用htpps访问web,或者使用wget --ca-certificate=/home/alice/root.crt https://IP:8443,它显示200 ok。

这是与tomcat对话的日志。

    Thu Sep  2 10:17:24 2015,comm.c[336](func_send): release qbuf to empty_qbuf_head ok.
    Thu Sep  2 10:17:24 2015,comm.c[279](func_send): wait SEM_SEND.
    Thu Sep  2 10:17:24 2015,comm.c[702](sock_recv): result=1 Recv Data _pdb: H
    Thu Sep  2 10:17:24 2015,comm.c[432](func_recv): res=1 Recv Data p_data: H
    Thu Sep  2 10:17:24 2015,comm.c[435](func_recv): colin bbb TO func_recv countqn=1
    Thu Sep  2 10:17:24 2015,comm.c[436](func_recv): insert qbuf to recv_qbuf_head ok.
    Thu Sep  2 10:17:24 2015,comm.c[493](func_recv): post SEM_RECV.
    Thu Sep  2 10:17:24 2015,comm.c[402](func_recv): colin aaa TO func_recv countqn=2
    Thu Sep  2 10:17:24 2015,comm.c[410](func_recv): get qbuf from empty_qbuf_head ok.
    Thu Sep  2 10:17:24 2015,comm.c[418](func_recv): colin ready to sock_recv.
    Thu Sep  2 10:17:24 2015,comm.c[702](sock_recv): result=1285 Recv Data _pdb: TTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    SOAPAction:
    Content-Type: text/xml;charset=ISO-8859-1
    Content-Length: 1124
    Date: 02 Sep 2015 02:16:51 GMT

“Recv Data _pdb”是我收到的数据包。我收到H然后TPP/1.1 ...,它会出错。如果收到HTTP/1.1 ...,一切都很好。 通常,数据包应为HTTP/1.1 ...,但它表明tomcat发送数据包H和数据包TTP/1.1 ...

我找到了一些HTTP连接器https://tomcat.apache.org/tomcat-7.0-doc/config/http.html的设置,但没有任何关系。

Tomcat版本:Apache Tomcat / 7.0.52(Ubuntu) OS: 分销商ID:Ubuntu 描述:Ubuntu 14.04.2 LTS 发布:14.04 代号:可信赖

这是server.xml的部分内容。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" />

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="/home/jack/example.pkcs12"  
           keystoreType="PKCS12"
           keystorePass="password" />

有人有想法吗?让我知道哪一方是错的。感谢。

2015/09/03更新: 在服务器端,我使用tcpdump来捕获数据包,并打开wireshark来解析它。因为设备收到H和TPP / 1.1,所以会话不完全;因此,我们不能使用带有私钥的wireshark来解密数据包.I只能看到数据长度来猜测它。如前所示,tomcat发送两个数据包。

1 个答案:

答案 0 :(得分:0)

他们都是对的。 HTTP协议未在数据包中定义,而是作为字节流。底层的TCP / IP协议必须将流选择为数据包,但它们会在接收端按顺序重新组装。

如果您的代码读取HTTP,则必须等待更多输入。它不能假设数据一起或以某些块的形式到达。

数据结束在HTTP中定义明确。当收到2对CR LFCR LF CR LF)时,HTTP标头结束。如果标头指示有效负载,则标头必须:

  • 以字节为单位指定大小(Content-Length
  • 使用chunkingTransfer-Encoding: chunked
  • 不使用keep-alive。连接关闭时数据结束。