У меня есть тривиальный сценарий CGI, который выводит простой текстовый контент. Он написан на Perl и использует CGI
модуль и определяет только самые основные заголовки:
print $q->header(
-type => 'text/plain',
-Content_length => $length,
);
print $stuff;
Нет очевидной проблемы с функциональностью - ни пользовательский агент, ни сервер немного не жалуются, но меня смущает тот факт, что Wireshark не распознает ответ HTTP как HTTP - он помечен как TCP.
Вот запрос и ответ, как показано в диалоговом окне «Follow TCP Stream»:
GET /cgi-bin/memfile/memfile.pl?mbytes=1 HTTP/1.1
Host: 10.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: cs,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
HTTP/1.1 200 OK
Date: Thu, 05 Apr 2012 18:52:23 GMT
Server: Apache/2.2.15 (Win32) mod_ssl/2.2.15 OpenSSL/0.9.8m
Content-length: 1048616
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain; charset=ISO-8859-1
XXXXXXXX...
А вот и обзор пакета)
No. Time Source srcp Destination dstp Protocol Info tcp.stream abstime
5 0.112749 10.0.0.1 80 10.0.0.2 48072 TCP [TCP segment of a reassembled PDU] 0 20:52:23.228063
Frame 5: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits)
Ethernet II, Src: 00:12:34:56:78:9a, Dst: 00:12:34:56:78:9b
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
Transmission Control Protocol, Src Port: http (80), Dst Port: 48072 (48072), Seq: 1, Ack: 330, Len: 1460
Теперь, когда я открываю поток в Wireshark:
GET /cgi-bin/memfile/memfile.pl
, как я и ожидалМожет кто-нибудь объяснить, почему Wireshark не распознает HTTP-природу пятого пакета? Что-то не так с ответом?
У меня была такая же проблема, и я обнаружил ответ в Wireshark Q&A:
Вы можете заставить Wireshark сразу отображать HTTP-ответ, отключив параметр «Разрешить субдиссектору повторно собирать потоки TCP» в настройках протокола TCP »(вам необходимо перезапустить Wireshark после отключения этой опции).
Чтобы объяснить Зачем ответа Зореля ....
Когда WireShark предпочитает повторно собирать многопакетные сообщения, он не знает, что сообщения является HTTP, пока он не увидит все и не завершит сборку.
Таким образом, пакеты сначала сообщаются как TCP (каковыми они и являются), а после повторной сборки снова сообщаются как HTTP.
В собранной строке вы должны увидеть что-то вроде:
Frame 10: ...
...
[3 Reassembled TCP segments (2496 bytes): #8(316), #9(1324), #10(856)]
Hypertext Transfer Protocol
...
Это указывает, какие номера записей и сколько байтов предоставлено для создания повторно собранной записи.
В вашем случае ответ будет 1048616
байтов, поэтому перед ним будет МНОГО пакетов знает это HTTP. Ваша указанная запись действительно говорит:
[TCP segment of a reassembled PDU]
Это еще один признак того, что WireShark откладывает окончательный вывод этого сообщения.