PHP面试题:什么是TCP“3次握手,4次挥手”TCP是一种面向连接的单播协议php读取tcp包数据 , 在发送数据前php读取tcp包数据,通信双方必须在彼此间建立一条连接 。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等 。
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题 。在连接的建立过程中,双方需要交换一些连接的参数 。这些参数可以放在TCP头部 。
TCP提供php读取tcp包数据了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接 。采用4次挥手来关闭一个连接 。
对于一个已经建立的连接 , TCP使用改进的四次握手来释放连接(使用一个带有FIN附加标记的报文段) 。TCP关闭连接的步骤如下php读取tcp包数据:
Tcpdump 看这一篇就够了tcpdump是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包 , 这个库在几乎在所有的 Linux/Unix 中都有 。熟悉 tcpdump 的使用能够帮助你分析调试网络数据,本文将通过一个个具体的示例来介绍它在不同场景下的使用方法 。不管你是系统管理员,程序员 , 云原生工程师还是 yaml 工程师,掌握 tcpdump 的使用都能让你如虎添翼,升职加薪 。
tcpdump的常用参数如下:
额外再介绍几个常用参数:
-A表示使用ASCII字符串打印报文的全部数据,这样可以使读取更加简单,方便使用grep等工具解析输出内容 。-X表示同时使用十六进制和ASCII字符串打印报文的全部数据 。这两个参数不能一起使用 。例如:
后面可以跟上协议名称来过滤特定协议的流量,以UDP为例,可以加上参数udp或protocol 17 , 这两个命令意思相同 。
同理, tcp与protocol 6意思相同 。
使用过滤器host可以抓取特定目的地和源IP地址的流量 。
也可以使用src或dst只抓取源或目的地:
使用 tcpdump 截取数据报文的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式 , 很多的数据一行行快速闪过,根本来不及看清楚所有的内容 。不过,tcpdump 提供了把截取的数据保存到文件的功能,以便后面使用其他图形工具(比如 wireshark,Snort)来分析 。
-w选项用来把数据报文输出到文件:
如果想实时将抓取到的数据通过管道传递给其他工具来处理,需要使用-l选项来开启行缓冲模式(或使用-c选项来开启数据包缓冲模式) 。使用 -l选项可以将输出通过立即发送给其他命令,其他命令会立即响应 。
过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/ 、 或/OR/|| 和 非/not/! 。
关于 tcpdump 的过滤器,这里有必要单独介绍一下 。
机器上的网络报文数量异常的多,很多时候我们只关系和具体问题有关的数据报(比如访问某个网站的数据,或者 icmp 超时的报文等等),而这些数据只占到很小的一部分 。把所有的数据截取下来,从里面找到想要的信息无疑是一件很费时费力的工作 。而 tcpdump 提供了灵活的语法可以精确地截取关心的数据报 , 简化分析的工作量 。这些选择数据包的语句就是过滤器(filter)!
Host 过滤器用来过滤某个主机的数据报文 。例如:
该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量 。如果想只抓取从该主机发出的流量,可以使用下面的命令:
Network 过滤器用来过滤某个网段的数据,使用的是 CIDR[2] 模式 。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x) 。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0 , 二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为 255.0.0.0 。例如 ,
抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:
抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量:
和 Host 过滤器一样,这里也可以指定源和目的:
也可以使用 CIDR 格式:
Proto 过滤器用来过滤某个协议的数据,关键字为 proto,可省略 。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp 。因为通常的协议名称是保留字段,所以在与 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义 。Linux 中的 shell 需要使用两个反斜杠来转义 , MacOS 只需要一个 。
例如,抓取 icmp 协议的报文:
Port 过滤器用来过滤通过某个端口的数据报文,关键字为 port 。例如:
截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义 。
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106 , 源端口是 56166,目的地址是 124.192.132.54,目的端口是 80 。符号代表数据的方向 。
此外 , 上面的三条数据还是 tcp 协议的三次握手过程 , 第一条就是 SYN 报文,这个可以通过 Flags [S] 看出 。下面是常见的 TCP 报文的 Flags:
下面给出一些具体的例子 , 每个例子都可以使用多种方法来获得相同的输出,你使用的方法取决于所需的输出和网络上的流量 。我们在排障时,通常只想获取自己想要的内容,可以通过过滤器和 ASCII 输出并结合管道与 grep、cut、awk 等工具来实现此目的 。
例如,在抓取 HTTP 请求和响应数据包时,可以通过删除标志 SYN/ACK/FIN 来过滤噪声 , 但还有更简单的方法 , 那就是通过管道传递给 grep 。在达到目的的同时,我们要选择最简单最高效的方法 。下面来看例子 。
从 HTTP 请求头中提取 HTTP 用户代理:
通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
抓取 HTTP GET 流量:
也可以抓取 HTTP POST 请求流量:
注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包 。
上述两个表达式中的十六进制将会与 GET 和 POST 请求的 ASCII 字符串匹配 。例如,tcp[((tcp[12:1]0xf0)2):4] 首先会确定我们感兴趣的字节的位置[3](在 TCP header 之后),然后选择我们希望匹配的 4 个字节 。
提取 HTTP 请求的主机名和路径:
从 HTTP POST 请求中提取密码和主机名:
提取 Set-Cookie(服务端的 Cookie)和 Cookie(客户端的 Cookie):
查看网络上的所有 ICMP 数据包:
通过排除 echo 和 reply 类型的数据包使抓取到的数据包不包括标准的 ping 包:
可以提取电子邮件的正文和其他数据 。例如,只提取电子邮件的收件人:
抓取 NTP 服务的查询和响应
通过 SNMP 服务,渗透测试人员可以获取大量的设备和系统信息 。在这些信息中,系统信息最为关键,如操作系统版本、内核版本等 。使用 SNMP 协议快速扫描程序 onesixtyone,可以看到目标系统的信息:
当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件 。例如,下面的命令表示每 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200*1000000 字节:
这些文件的命名为 capture-{1-24}.pcap,24 小时之后,之前的文件就会被覆盖 。
可以通过过滤器 ip6 来抓取 IPv6 流量,同时可以指定协议如 TCP:
从之前保存的文件中读取 IPv6 UDP 数据报文:
在下面的例子中,你会发现抓取到的报文的源和目的一直不变,且带有标志位 [S] 和 [R],它们与一系列看似随机的目标端口进行匹配 。当发送 SYN 之后 , 如果目标主机的端口没有打开,就会返回一个 RESET 。这是 Nmap 等端口扫描工具的标准做法 。
本例中 Nmap NSE 测试脚本 http-enum.nse 用来检测 HTTP 服务的合法 URL 。
在执行脚本测试的主机上:
在目标主机上:
向 Google 公共 DNS 发起的出站 DNS 请求和 A 记录响应可以通过 tcpdump 抓取到:
抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):
通常 Wireshark(或 tshark)比 tcpdump 更容易分析应用层协议 。一般的做法是在远程服务器上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析 。
还有一种更高效的方法 , 可以通过 ssh 连接将抓取到的数据实时发送给 Wireshark 进行分析 。以 MacOS 系统为例,可以通过 brew cask install wireshark 来安装,然后通过下面的命令来分析:
例如,如果想分析 DNS 协议 , 可以使用下面的命令:
抓取到的数据:
找出一段时间内发包最多的 IP , 或者从一堆报文中找出发包最多的 IP , 可以使用下面的命令:
cut -f 1,2,3,4 -d '.': 以 . 为分隔符,打印出每行的前四列 。即 IP 地址 。
sort | uniq -c : 排序并计数
sort -nr: 按照数值大小逆向排序
本例将重点放在标准纯文本协议上,过滤出于用户名和密码相关的报文:
最后一个例子 , 抓取 DHCP 服务的请求和响应报文,67 为 DHCP 端口,68 为客户机端口 。
本文主要介绍了 tcpdump 的基本语法和使用方法 , 并通过一些示例来展示它强大的过滤功能 。将 tcpdump 与 wireshark 进行组合可以发挥更强大的功效 , 本文也展示了如何优雅顺滑地结合 tcpdump 和 wireshark 。如果你想了解更多的细节,可以查看 tcpdump 的 man 手册 。
谁来讲解下TCP数据包的具体内容?TCP数据包结构:
1-1.源始端口16位,范围当然是0-65535 。
1-2.目的端口,同上 。
2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号 。
3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号 。
4-1.偏移4位 , 类似IP,表明数据距包头有多少个32位 。
4-2.保留6位,未使用,应置零 。
4-3.紧急比特URG—当URG=1时,表明紧急指针字段有效 。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据) 。
4-3.确认比特ACK—只有当ACK=1时确认号字段才有效 。当ACK=0时 , 确认号无效 。参考TCP三次握手 。
4-4.复位比特RST(Reset) —当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因) , 必须释放连接,然后再重新 建立运输连接 。参考TCP三次握手 。
4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文 。参考TCP三次握手 。
4-6.终止比特FIN(FINal)—用来释放一个连接 。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接 。
4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节 。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口 大?。?然后通知对方以确定对方的发送窗口的上限 。
5-1.包校验和16位,包括首部和数据这两部分 。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部 。
5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号 。
6-1.可选选项24位,类似IP,是可选选项 。
6-2.填充8位,使选项凑足32位 。
7-1.用户数据 。
PHP如何获取非Form表单中的数据?这个可以用AJAX技术啦,,用JS去取得内容,document.getElementById();这样取得内容后再传给一个处理的PHP文件.然后再使用JS去返回到HTML页面里就可以了. 简单吧///
如何在PHP中使用socket XML发送数据包接收指定IP的数据包,其他IP都要过滤吧,那就用防火墙来搞吧
使用的是client段的获取方式,用client的可以指定IP,代码大概如下
public void SendMessage()
{
ASCII = Encoding.ASCII;
// 构造用于发送的 字节缓冲.
Byte[] sendBytes = ASCII.GetBytes(SEND_MESSAGE);
// 构造用于接收的 字节缓冲.
Byte[] recvBytes = new Byte[256];
// IP地址.
IPAddress localAddr = IPAddress.Parse("192.168.19.81");
// 接入点.
IPEndPoint ephost = new IPEndPoint(localAddr, PORT);
// 第一个参数:AddressFamily = 指定 Socket 类的实例可以使用的寻址方案 。
//Unspecified 未指定地址族 。
//InterNetwork IP 版本 4 的地址 。
//InterNetworkV6 IP 版本 6 的地址 。
//
// 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型 。
//Stream 一个套接字类型 , 支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界 。
//此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接 。
//此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6 。
//
// 第三个参数:ProtocolType = 指定 Socket 类支持的协议 。
//Tcp 传输控制协议 (TCP) 。
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// 尝试连接主机.
s.Connect(ephost);
//Console.WriteLine("向服务器发送到了:{0}", SEND_MESSAGE);
// 向主机发送数据.
// s.Send(sendBytes, sendBytes.Length, SocketFlags.None);
// 接收服务器的应答.
Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
StringBuilder buff = new StringBuilder();
//while (bytes0)
//{
// 将缓冲的字节数组 , 装换为字符串.
//String str = ASCII.GetString(recvBytes, 0, bytes);
String str = "";
for (int i = 0; irecvBytes.Length; i)
{
str = strrecvBytes[i];
}
int iCount = 0;
iCount = int.Parse(str.Substring(13, 6)) ;
// 加入字符串缓存
【php读取tcp包数据 读取php文件内容】buff.Append(str);
// 再次接受,看看后面还有没有数据.
//bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
//}
textBox1.Text = iCount.ToString();
}
catch (Exception ex)
{
MessageBox.Show("连接/发送/接收过程中,发生了错误!");
MessageBox.Show(ex.Message);
//Console.WriteLine("连接/发送/接收过程中,发生了错误!");
//Console.WriteLine(ex.Message);
//Console.WriteLine(ex.StackTrace);
}
finally
{
s.Close();
}
php读取tcp包数据的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于读取php文件内容、php读取tcp包数据的信息别忘了在本站进行查找喔 。
推荐阅读
- jquery去除引入js,jquery怎么移除标签onclick属性
- sqlserver视图创建输入参数,sqlserver如何创建视图
- Bing如何进入chatGPT,Bing如何进入chatGPT
- 土耳其模拟军事游戏破解版,土耳其 游戏
- vb需要.net吗 vbnet msdn
- python在一个for循环俩个列表,python中for循环两个变量
- 怎么把卡弄到硬盘里面,怎么把卡安到卡槽里
- pg数据库无法删除,pg数据库无法删除怎么办
- 菜鸟linux命令 linux菜鸟驿站