目录
协议头
ip头
udp头
mac层
网络工具 telnet wireshark
Http
一、HTTP 协议介绍
二、HTTP 协议的工作过程
三、使用抓包工具抓取报文
四、获取到http请求报文:
五、http请求(request)
(一)、认识URL
项目:天气预报
协议头
ip头
(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于IPv6,目前还处于草案阶段。
(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。
(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
(5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志(flag) 占3位,但目前只有2位有意义。
● 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个
● 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
(7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。
(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
(11)源IP地址 占32位。
(12)目的IP地址 占32位。
udp头
用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(图 5-5),由四个字段组成,每个字段的长度都是两个字节。各字段意义如下:
(1)源端口 源端口号。在需要对方回信时选用。不需要时可用全0。用于标识发送方的端口。
(2)目的端口 目的端口号。这在终点交付报文时必须要使用到。用于标识接收方的端口。
(3)长度 UDP用户数据报的长度,其最小值是8(仅有首部)。表示UDP头部和数据的总长度。
(4)校验和 检测 UDP用户数据报在传输中是否有错。有错就丢弃。用于检验UDP头部和数据在传输过程中是否发生了错误。虽然是可选的,但推荐使用以增加数据传输的可靠性。
mac层
VLAN 标记字段的长度是4字节,插入在以太网MAC 帧的源地址字段和类型字段之间。VLAN 标记的前两个字节总是设置为0x8100(即二进制的1000000100000000),称为IEEE 802.1Q 标记类型。当数据链路层检测到 MAC 帧的源地址字段后面的两个字节的值是0x8100时,就知道现在插入了4字节的VLAN标记。于是就接着检查后面两个字节的内容。在后面的两个字节中,前3位是用户优先级字段,接着的一位是规范格式指示符CFI(Canonical Format Indicator)",最后的12位是该虚拟局域网VLAN标识符 VID(VLANID),它唯一地标志了这个以太网帧是属于哪一个 VLAN。由于用于 VLAN 的以太网帧的首部增加了4个字节,因此以太网的最大长度从原来的1518字节(1500字节的数据加上18字节的首部)变为1522字节。
网络工具 telnet wireshark
常用网络测试工具
telnet netstat ping arp wireshark tcpdump
sudo ufw disable
sudo apt-get install openssh-server openssh-client
sudo apt-get install wireshark
1、telnet 远程登录工具,默认都是系统安装。
sudo ufw disable//关闭防火墙
sudo ufw status//查看防火墙状态
sudo apt-get install openssh-server openssh-client//下载远程登陆工具ssh,客户端和服务端一起下载
使用格式: telnet ip地址 端口
eg: telnet 192.168.1.1 8888
注意:如果没有写端口,则默认登录23 号端口。
2、netstat 测试查看网络端口使用情况
netstat -anp
netstat -n ===>列出当前所有网络端口使用情况
netstat -n -t ===>列出所有TCP通信的端口信息
netstat -n -u ===>列出所有UDP通信的端口信息
netstat -n -i ===>列出默认接口上的通信信息
netstat -lnp |grep 8888 ===>查看指定端口上的通信详情
3、ping 命令 测试网路的联通状况
ping ip地址
ping 域名
4、arp 地址解析命令
arp -an ===>列出当前主机的地址ARP表
arp -d ip地址
5、wireshark 抓包工具 tcp.port == 50000 && tcp.ip == 192.168.0.183
sudo apt-get install wireshark//下载wireshark,网络抓包工具。启动的时候在命令行使用sudo wireshark运行,不然权限不足,影响后续的网络抓包
step:1
step:2
换网关:
step:3
复制内容,右键->copy->as printable Text
过滤规则:
1、根据ip地址过滤:ip.src == x.x.x.x
ip.dst == x.x.x.x
2、根据端口过滤:tcp.srcport == xx;
tcp.dstport == xx;
udp.srcport == xx;
udp.dstport == xx;
3、根据协议类型过滤:
tcp udp icmp .....
4、任意组合以上条件抓包:
如果与的关系: and
ip.src == 192.168.1.100 and tcp.dstport == 9999
如果或关系 : or
ip.src == 192.168.1.100 or ip.dst == 192.168.1.102
tcp host 192.168.1.100
Http
一、HTTP 协议介绍
基本介绍:
HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0
协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。就像是两个人传递纸条通过互相指定的暗号,如果发送天亮了,表示可以打游戏了等等
注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。HTTPS 将在本文末尾具体介绍
二、HTTP 协议的工作过程
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。
基础术语:
客户端: 主动发起网络请求的一端
服务器: 被动接收网络请求的一端
请求: 客户端给服务器发送的数据
响应: 服务器给客户端返回的数据
HTTP 协议的重要特点: 一发一收,一问一答
注意: 网络编程中,除了一发一收之外,还有其它的模式
多发一收:例如上传大文件
一发多收:例如看直播时,搜索一个词条可以得到多个视频源
多发多收:例如串流(steam link、moonlight 等等)
三、使用抓包工具抓取报文
wireshark,或者浏览器自带的f12
四、获取到http请求报文:
GET /?app=weather.today&cityNm=%E6%88%90%E9%83%BD&appkey=73908&sign=0b3399b07636fe2db150dbcb93a221cf&format=json HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Host: api.k780.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0
会得到http响应报文,及响应文档,有时会一起发过来,有时会分段发送过来
五、http请求(request)
(一)、认识URL
URL(统一资源定位符,Uniform Resource Locator)是用来在Web上标识和定位资源的地址。HTTP请求中的URL包含了有关资源的详细信息,使得客户端能够准确地访问所需的资源。URL由多个部分组成,每部分都有其特定的功能和含义。下面是对URL各个组成部分的详细介绍:
URL的组成部分
-
协议(Scheme)
-
定义: 指定用于访问资源的协议或方式。
-
格式:
scheme://
-
示例:
http://
、https://
、ftp://
等。 -
作用: 指定如何获取资源。HTTP和HTTPS是最常见的协议,用于Web资源的访问。
-
-
主机(Host)
-
定义: 资源所在的服务器的域名或IP地址。
-
格式:
host
-
示例:
www.example.com
、192.168.1.1
。 -
作用: 确定要访问的服务器的地址。
-
-
端口(Port)
-
定义: 服务器上用于接收请求的端口号(可选)。
-
格式:
:port
-
示例:
:80
(HTTP的默认端口),:443
(HTTPS的默认端口)。 -
作用: 指定服务器上的具体端口,以便客户端可以正确地连接到服务。通常情况下,端口号在默认值时可以省略。
-
-
路径(Path)
-
定义: 服务器上资源的具体位置。
-
格式:
/path/to/resource
-
示例:
/index.html
、/images/pic.jpg
。 -
作用: 确定资源在服务器上的位置。路径通常反映了服务器上的文件结构。
-
-
查询字符串(Query String)
-
定义: 附加到URL末尾的键值对,用于传递额外的参数。
-
格式:
?key1=value1&key2=value2
-
示例:
?search=chatGPT&page=1
。 -
作用: 用于传递数据给服务器,例如表单提交数据或动态请求参数。查询字符串由键值对组成,键和值通过等号
=
连接,不同的键值对通过&
分隔。
-
-
片段标识符(Fragment Identifier)
eg:
https://www.example.com:8080/path/to/resource?query1=value1&query2=value2#section
-
定义: 用于标识文档中的特定部分。
-
格式:
#fragment
-
示例:
#section1
、#top
。 -
作用: 通常用于页面内的导航,告诉浏览器滚动到特定的位置或内容。片段标识符不会发送到服务器,它只对客户端有效。
-
-
协议:
https
-
主机:
www.example.com
-
端口:
8080
-
路径:
/path/to/resource
-
查询字符串:
query1=value1&query2=value2
-
片段标识符:
#section
项目:天气预报
在接收服务器发送的数据的时候,可能会出现网络波动,导致服务器多次发送(keep-alive 长链接,不立刻断开,大部分服务器是两分钟断开),而我们大部分写出的程序都是只有一个recv
所以针对这种情况有四种解决方案
(1)延时接收sleep(3);
(2)循环recv,拼接,判断"0\r\n"结束标志,弹出循环
(3)请求报文为keep-alive长连接,改为close短链接,服务器就会先断开
(4)timeout超时处理