http curl访问的tcp数据包分析

http curl访问的tcp数据包分析

可能每次抓包效果都不尽相同。
参考1
参考2

14:46:43.462029 IP (tos 0x0, ttl 64, id 26825, offset 0, flags [DF], proto TCP (6), length 60)
    10.1.16.122.43966 > 180.101.49.12.http: Flags [S], cksum 0xbc2f (correct), seq 3150689946, win 64202, options [mss 1366,sackOK,TS val 2121004026 ecr 0,nop,wscale 7], length 0
14:46:43.501713 IP (tos 0x0, ttl 48, id 26825, offset 0, flags [DF], proto TCP (6), length 60)
    180.101.49.12.http > 10.1.16.122.43966: Flags [S.], cksum 0x5f15 (correct), seq 2285380873, ack 3150689947, win 8192, options [mss 1366,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 0
14:46:43.501769 IP (tos 0x0, ttl 64, id 26826, offset 0, flags [DF], proto TCP (6), length 40)
    10.1.16.122.43966 > 180.101.49.12.http: Flags [.], cksum 0xe19d (correct), seq 1, ack 1, win 502, length 0
14:46:43.501917 IP (tos 0x0, ttl 64, id 26827, offset 0, flags [DF], proto TCP (6), length 117)
    10.1.16.122.43966 > 180.101.49.12.http: Flags [P.], cksum 0xac52 (correct), seq 1:78, ack 1, win 502, length 77: HTTP, length: 77
        GET / HTTP/1.1
        Host: www.baidu.com
        User-Agent: curl/7.68.0
        Accept: */*

14:46:43.537630 IP (tos 0x0, ttl 40, id 55557, offset 0, flags [DF], proto TCP (6), length 40)
    180.101.49.12.http > 10.1.16.122.43966: Flags [.], cksum 0xdfba (correct), seq 1, ack 78, win 908, length 0
14:46:43.537680 IP (tos 0x0, ttl 40, id 55556, offset 0, flags [DF], proto TCP (6), length 40)
    180.101.49.12.http > 10.1.16.122.43966: Flags [.], cksum 0xdfba (correct), seq 1, ack 78, win 908, length 0
14:46:43.538789 IP (tos 0x0, ttl 40, id 55558, offset 0, flags [DF], proto TCP (6), length 1400)
    180.101.49.12.http > 10.1.16.122.43966: Flags [.], cksum 0x1b6d (correct), seq 1:1361, ack 78, win 908, length 1360: HTTP, length: 1360
        HTTP/1.1 200 OK
        Accept-Ranges: bytes
        Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
        Connection: keep-alive
        Content-Length: 2381
        Content-Type: text/html
        Date: Wed, 20 Jul 2022 06:46:43 GMT
        Etag: "588604c8-94d"
        Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
        Pragma: no-cache
        Server: bfe/1.0.8.18
        Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

        <!DOCTYPE html>
14:46:43.538820 IP (tos 0x0, ttl 64, id 26828, offset 0, flags [DF], proto TCP (6), length 40)
    10.1.16.122.43966 > 180.101.49.12.http: Flags [.], cksum 0xdc00 (correct), seq 78, ack 1361, win 502, length 0
14:46:43.576365 IP (tos 0x0, ttl 40, id 55562, offset 0, flags [DF], proto TCP (6), length 40)
    180.101.49.12.http > 10.1.16.122.43966: Flags [.], cksum 0xd4dc (correct), seq 2782, ack 79, win 908, length 0
14:46:43.576425 IP (tos 0x0, ttl 40, id 55563, offset 0, flags [DF], proto TCP (6), length 40)
    180.101.49.12.http > 10.1.16.122.43966: Flags [F.], cksum 0xd4db (correct), seq 2782, ack 79, win 908, length 0
14:46:43.576452 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    10.1.16.122.43966 > 180.101.49.12.http: Flags [.], cksum 0xd671 (correct), seq 79, ack 2783, win 502, length 0

1、在建立连接之前,http服务器创建TCB(传输控制块),准备接受客户进程的连接请求,处于LISTEN(监听)状态
2、curl首先创建TCB,然后向http服务器发出连接请求,SYN置1,同时选择初始序号seq=3150689946,进入SYN-SEND(同步已发送)状态
3、http服务器收到连接请求后向curl发送确认,SYN置1,ACK置1,同时产生一个确认序号ack=3150689947。同时随机选择初始序号seq=2285380873,进入SYN-RCVD(同步收到)状态
4、curl收到确认连接请求后,ACK置1,确认号ack=1,seq=1,进入到ESTABLISHED(已建立连接)状态。向http服务器发出确认连接,最后http服务器也进入到ESTABLISHED(已建立连接)状态。
5、curl向http服务器发送请求PUSH置1,ACK置1,seq 1:78, ack 1,数据长度78
6、服务器两次回包确认,ACK置1,seq 1, ack 78 (此处应该是网络影响)
7、服务器再次回包,ACK置1,seq 1:1361, ack 78,数据长度1360
8、curl向http服务器回包,ACK置1,seq 78, ack 1361
9、http服务器向curl发包,ACK置1,seq 2782, ack 79
10、http服务器向curl发包,FINISH置1,ACK置1,seq 2782, ack 79
11、curl向http服务器回包,ACK置1,seq 79, ack 2783

附:其他curl一次抓包结果

15:28:45.577771 IP (tos 0x0, ttl 64, id 32204, offset 0, flags [DF], proto TCP (6), length 60)
    172.27.35.3.33198 > 172.27.35.1.http: Flags [S], cksum 0x62f0 (correct), seq 3211320081, win 64240, options [mss 1460,sackOK,TS val 1085402809 ecr 0,nop,wscale 7], length 0
15:28:45.578861 IP (tos 0x0, ttl 128, id 47347, offset 0, flags [DF], proto TCP (6), length 52)
    172.27.35.1.http > 172.27.35.3.33198: Flags [S.], cksum 0x8441 (correct), seq 2015148013, ack 3211320082, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
15:28:45.578908 IP (tos 0x0, ttl 64, id 32205, offset 0, flags [DF], proto TCP (6), length 40)
    172.27.35.3.33198 > 172.27.35.1.http: Flags [.], cksum 0xc31e (correct), ack 1, win 502, length 0
15:28:45.578999 IP (tos 0x0, ttl 64, id 32206, offset 0, flags [DF], proto TCP (6), length 115)
    172.27.35.3.33198 > 172.27.35.1.http: Flags [P.], cksum 0x63e1 (correct), seq 1:76, ack 1, win 502, length 75: HTTP, length: 75
        GET / HTTP/1.1
        Host: 172.27.35.1
        User-Agent: curl/7.68.0
        Accept: */*

15:28:45.581692 IP (tos 0x0, ttl 128, id 47349, offset 0, flags [DF], proto TCP (6), length 57)
    172.27.35.1.http > 172.27.35.3.33198: Flags [P.], cksum 0x02ec (correct), seq 1:18, ack 76, win 512, length 17: HTTP, length: 17
        HTTP/1.0 200 OK
15:28:45.581726 IP (tos 0x0, ttl 64, id 32207, offset 0, flags [DF], proto TCP (6), length 40)
    172.27.35.3.33198 > 172.27.35.1.http: Flags [.], cksum 0xc2c2 (correct), ack 18, win 502, length 0
15:28:45.581754 IP (tos 0x0, ttl 128, id 47350, offset 0, flags [DF], proto TCP (6), length 355)
    172.27.35.1.http > 172.27.35.3.33198: Flags [FP.], cksum 0xef0d (correct), seq 18:333, ack 76, win 512, length 315: HTTP
15:28:45.581873 IP (tos 0x0, ttl 64, id 32208, offset 0, flags [DF], proto TCP (6), length 40)
    172.27.35.3.33198 > 172.27.35.1.http: Flags [F.], cksum 0xc186 (correct), seq 76, ack 334, win 501, length 0
15:28:45.586416 IP (tos 0x0, ttl 128, id 47351, offset 0, flags [DF], proto TCP (6), length 40)
    172.27.35.1.http > 172.27.35.3.33198: Flags [.], cksum 0xc17b (correct), ack 77, win 512, length 0

关于数据标志位

参考
TCP报文中共有6个标志位。

URG:紧急标志位

ACK:确认标志位

PSH:推送标志位

RST:复位标志位

SYN:同步标志位

FIN:结束标志位

URG :紧急标志位,它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已经放置在普通数据流中,由接收方决定如何处理。

当URG=1时表明紧急指针字段有效,即告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送,发送方的TCP就把紧急数据放到本报文段数据的最前面。URG标志位要与首部中的紧急指针字段配合使用,紧急指针指向数据段中的某个字节(数据从第一个字节到指针所指的字节就是紧急数据)。需要注意的是,即使窗口为0时也可以发送紧急数据,此时紧急数据不进入接收缓冲区直接交给上层进程。

PSH :推送标志位,当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令时立即收到对方的响应。这时,发送方TCP将PSH标志位置1,立即创建一个报文段发送出去,接收方TCP收到PSH位为1的报文,会尽快的交付给应用层,而不是等到缓存填满后交付。

PSH标志是为了提示接收端的应用程序应该立即从TCP的接收缓冲区中拿走数据。

两相对比

(1)URG交付给进程的数据只有紧急数据

PSH交付给进程的数据是缓冲区排好序的数据以及当前报文中的数据

(2)URG强调的是直接读取数据,不会将该数据复制到缓存中

PSH强调的是尽快将数据交付给上层(协议),而不需要经过强迫数据交互。该部分数据是需要复制到缓存的,但不用等到缓冲区满才将数据交付给上层

(3)URG是针对发送方

PSH是针对接收方

URG和PSH的共同点是,两者都是一种对数据的处理方式,只不过URG是处理在前端,而PSH是在处理的后端告诉内核,不用等待缓冲区满再交付。

你可能感兴趣的:(基础知识,网络基础,tcp/ip,http,网络)