HTTP是一个Client和Server之间request和response的标准,通常使用TCP协议,預設的port是80,常見於網頁、Restful API等應用
經過了第二層、第三層、第四層的分析,總是離不開header,HTTP也有他的header,但是header不像前面幾層這麼固定,他能夠自己客製化,舉下面的http header為例子
Header of Client Request:
GET / HTTP/1.1
Host: www.google.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Header of Server Response
HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Aug, 11 Jan 2020 12:12:12 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: XXX
Connection: keep-alive
首先,HTTP request有多種不同的“動作”,其中POST, DELETE, PUT, DELETE這四個較常見,分別為增刪改查的意思,可以看到Header of Client Request的部分,首先就是用了GET,去查www.google.com
的網頁是什麼。Response的部分用數字代表結果,例如2xx就代表正常,4xx代表請求錯誤,例如404
http中的method,header,parameter等等的都混進去data段裡了,所以我用了正則表達式解析他,具體的實作方式在utils/tcp.py
的parse_http函數裡
測試傳送一個Get方法的HTTP request可以用curl
#> curl 172.17.0.5?hi=cc\&kk=bb
2020-09-07 04:10:00 PM INFO Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 49533 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 60404, 'DEST_PORT': 80, 'SEQ': 2505788126, 'ACK_NUM': 3831187585, 'Flags': '_,_,_,ACK,PSH,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22696, 'PTR': 0, 'HTTP': {'METHODS': b'GET', 'header': [b'User-Agent: curl/7.29.0', b'Host: 172.17.0.5', b'Accept: */*'], 'parameters': [b'hi=cc', b'kk=bb']}}
系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)
應該是Get
HTTP request有多種不同的“動作”,其中POST, DELETE, PUT, DELETE這四個較常見