网络七层协议和TCP

发布时间 2023-12-14 14:40:43作者: index72

搭建环境

使用nc工具搭建一个TCP服务器。

  • 服务端使用命令创建监听端口nc -l -p 1023
  • 客户端使用命令连接nc <目标ip> -p 1023
    以上使用tcpdump或者wireshark进行抓包
    搭建环境如下
    ![[Pasted image 20231214135926.png]]

使用wireshark抓包如下
![[Pasted image 20231214092055.png]]

TCP

抓包

在tcp使用wireshark抓包的时候,wireshark会帮你将数据包解析成人能看懂的形式。tcpdump也是类似相同,抓取到数据包之后,会解析成人能看懂的数据。

尽可能不要使用抓取TCP或者UDP的包方式来排查问题,优先从http请求,和路由的信息来进行排查

4 3.515901086 127.0.0.1 127.0.0.1 TCP 70 35184 → 1024 [PSH, ACK] Seq=1 Ack=1 Win=33280 Len=4 TSval=3430981847 TSecr=3430978331
数据包传输的数据如下 传递了字符串aaa

..............E.
.8.U@.@.[h......
...p..kM.:J5.I..
...,............
..aaa.

网络七层协议的表现

  • 物理层:因为是属于物理上的传输数据,和网线的介质相关,无法通过抓包表现
  • 数据链路层:用作寻找mac地址
  • 网络层:用作表示ip的起始地址和目标地址。可以用作排查数据发向什么位置
  • 传输层:用作表明这个数据包是什么协议,以及指定的端口。以及数据包的标识,在tcp上有标识但是在udp上并不会显示标识。并且会显示Win滑动窗口,用作标识这个TCP数据包有多大,Len表示还可以读取多少字节。以及TSval和TSecr是时间戳,用作标识这个数据包的发送的往返时间。
  • 会话层:以TCP和UDP为主,在发送数据包之前会建立Socket连接,而会话层就是在这上面工作,用作长时间保留会话的对于会话的细节处理可以详细的了解一下请求的数据包格式
  • 表示层:用作处理数据的加密和解密的以及压缩等
  • 应用层:用于给应用层提供网络协议服务,

对于上面的七层协议,由于互联网并不是完全遵守七层协议而是更符合TCP/IP协议,所以参考意义不大

UDP

构建udp请求环境

抓到的请求

1 0.000000000 127.0.0.1 127.0.0.1 UDP 47 51750 → 1025 Len=5
UDP的数据包并不会有TCP的请求验证,所以单个数据包就直接携带了对应的数据。

UDP并不常用,通常是使用在游戏联机的协议,和一些视频流。用于节省带宽。

HTTP

http协议是基于TCP的,面向可靠的连接。通常,使用抓取http包软件使用的是,fidder或者mitmproxy,reqable等。总的思路都差不多,不同的工具对于抓取的数据包预览不同。mitmproxy支持支持编写python脚本对请求进行批量转化成curl以及对数据包的重写重放。
不推荐使用wireshark和tcpdump进行抓取http的数据包,一是因为数据包难看懂,可能多个TCP包才能构成一个完整的http请求包,二是,对于http请求的操作,比如重写,重放,解析请求参数,以及对请求的导出。这些操作,更专用的请求抓包工具是为更好用的。

在抓取https包的时候,需要先安装对应抓包工具的证书,不然无法识别https数据包。

在搜索引擎输入内容进行进行提前预览的时候,会得到下面的部分内容。

http请求

每一个http请求(request)都会有一个回复(response)。不同的请求类型,其参数也不尽相同。

curl -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'accept-language: en-US,en;q=0.5' --compressed -H 'referer: https://www.cnblogs.com/leesinx/' -H 'cookie: .AspNetCore.Antiforgery.b8-pDmTq1XM=CfDJ8DZoAyJmInJHoSwqM1IbzdRkQ3ChfTuoaCD4CHqpEwoRUe7nC7-r9YKJbYVAavjS21nxDwMEqFaalmQ2ijmxBC39eSFDL_FzhgboUVsAn2FSRnAuide7VPw77qKcDbcHH7VZgnO13_8n_By82ta5HGQ' -H 'cookie: Hm_lvt_866c9be12d4a814454792b1fd0fed295=1702522724' -H 'cookie: Hm_lpvt_866c9be12d4a814454792b1fd0fed295=1702522740' -H 'cookie: _ga_M95P3TTWJZ=GS1.1.1702522724.1.1.1702522740.0.0.0' -H 'cookie: _ga=GA1.1.1109548462.1702522724' -H 'upgrade-insecure-requests: 1' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-user: ?1' -H 'te: trailers' https://www.cnblogs.com/
内容 例子 解释
url http://baidu.com 唯一标识符,也是一个路由信息,当请求发送到内网之后可能会被其他的反向代理服务器进行处理。并且url中也可能包含参数信息
header accept: application/json, text/javascript, */*; q=0.01 请求头部信息,该信息。
body {"appId":"blog-web","browser":"Firefox"} 请求体,GET请求不能携带body但是可以携带查询字符串

POST请求

主要作用是向服务器请求修改信息,可以提供Body体内容。用作传递Json参数以及其他的信息。

GET请求

主要向服务器索取信息,其Body体不能提供content。但是可以提供查询字符串,在url中。通常会使用查询字符串在GET请求上。