HTTPプロトコル:pipeline、1つのパケットに複数のリクエストがあり、1つのパケットに複数の応答がある

3054 ワード

一、テストパッケージの入手方法
1.1コードのコンパイル、実行、発注
コンパイル:g++test.cpp生成a.out
実行:./a.out
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
using namespace std;

int main(int argc, char* argv[])
{
	int sock_srv = socket(AF_INET, SOCK_STREAM, 0);

	struct sockaddr_in addr_srv;
	bzero(&addr_srv, sizeof(struct sockaddr_in));
	addr_srv.sin_addr.s_addr = inet_addr("113.31.27.226");
	addr_srv.sin_family = AF_INET;
	addr_srv.sin_port = htons(80);
	int ret = connect(sock_srv, (struct sockaddr*)&addr_srv, sizeof(struct sockaddr));
	if(ret < 0)
	{
		cout<<"fail to connect."<<endl;
		close(sock_srv);
		return -1;
	}

	char buf[1500] = {"GET /aa.mp4?asf=sdaf HTTP/1.1\r
\ Host: 113.31.27.226\r
\ Connection: keep-alive\r
\ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
\ User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r
\ Accept-Encoding: gzip,deflate,sdch\r
\ Accept-Language: zh-CN,zh;q=0.8\r
\ \r
\ GET /fetch_ldns.png HTTP/1.1\r
\ Host: ns.pb.cachecn.net\r
\ Connection: keep-alive\r
\ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
\ User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r
\ Accept-Encoding: gzip,deflate,sdch\r
\ Accept-Language: zh-CN,zh;q=0.8\r
\ \r
\ GET /40x.jpg HTTP/1.1\r
\ Host: ns.pb.cachecn.net\r
\ Connection: keep-alive\r
\ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
\ User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.2 Safari/537.36\r
\ Accept-Encoding: gzip,deflate,sdch\r
\ Accept-Language: zh-CN,zh;q=0.8\r
\ \r
"}; cout<<"buf len: "<<strlen(buf)<<endl; ret = write(sock_srv, buf, strlen(buf)); if(ret < 0) { cout<<"fail to write."<<endl; close(sock_srv); return -1; } char rcv_buf[1500]; do { bzero(rcv_buf, 1500); ret = read(sock_srv, rcv_buf, 1500); if(ret < 0) { cout<<"fail to read."<<endl; close(sock_srv); return -1; } if(0 == ret) { cout<<"read finished."<<endl; break; } cout<<"recv data: "<<rcv_buf<<endl; }while(ret > 0); close(sock_srv); return 0; }

1.2パケットのキャプチャ
      tcpdump -i eth0 tcp and host 113.31.27.226 and port 80 -w 123.pcap
二、パケット分析
123.pcapをwindowsにダウンロードすると、wiresharkで分析できます.
     
      123.pcapダウンロードアドレス:http://download.csdn.net/detail/kanguolaikanguolaik/6486303
123 pcapの4番目のパケットは、リクエストパケットであり、このパケットには3つのリクエストが含まれている.
123 pcapの6番目のパケットは、応答パケットであり、このパケットには2つの応答が含まれている.