编程语言
首页 > 编程语言> > 在 Python 中编写传输控制协议堆栈

在 Python 中编写传输控制协议堆栈

作者:互联网

我们将使用的一些基本概念是:

另请注意,没有对此进行正确的错误处理。

TCP 握手

我们需要做的是与谷歌握手。这是TCP握手的一种工作方式:
假设我们有一个两个音节的单词索引,它被分解为IN-DEX。
发送HTTP请求的用户可以使用:在接受此请求的Google中
分配:INDEX
,而我则分配用户:DEX

在一个简单的代码中,这将如下所示:

# My local network IP
src_ip = "192.168.0.11"
# Google's IP
dest_ip = "96.127.250.29"
# IP header: this is coming from me, and going to Google
ip_header = IP(dst=dest_ip, src=src_ip)
# Specify a large random port number for myself (59333),
# and port 80 for Google The "S" flag means this is
# a SYN packet
syn = TCP(dport=80, sport=59333, 
          ack=0, flags="S")
# Send the SYN packet to Google
# scapy uses '/' to combine packets with headers
response = srp(ip_header / syn)
# Add the sequence number 
ack = TCP(dport=80, sport=self.src_port, 
          ack=response.seq, flags="A") 
# Reply with the ACK
srp(ip_header / ack)

什么是序列号?

TCP的想法是确保我们能够在某些数据包丢失的情况下重新发送数据包。序列号是一种检查我们是否遗漏了数据包的方法。在谷歌发送 3 个大小为 100、200 和 300 字节的数据包的情况下。同时假设初始序列号为 0。现在,这些数据包将具有 0、100、300 和 600 的数字。

TCP 序列号是 TCP 标头中的一个 4 字节字段,用于显示传出段的第一个字节。它还跟踪已传输和接收的数据量。始终设置 TCP 序列号字段。

例如,数据包的序列号为 X。此数据包的长度为 Y。如果数据包有效地传输到另一端,则下一个数据包的序列号为 X+Y。

当我们发送或重新发送数据包时,谷歌如何知道我们错过了数据包?好吧,每次谷歌收到数据包时,我们还需要发送一个 ACK,说我们收到了带有序列号的数据包。如果服务器注意到数据包尚未被确认(ACK 数据包是确认接收消息或一系列数据包的任何 TCP 数据包),它将重新发送它。了解有关 TCP 的更多概念

当您有一个 TCP 堆栈时会发生什么

如果您运行上面的代码,您会注意到有一个错误,我们得到了一个不同的数据包。在这种情况下,正在发生的事情是:

Python prgram: IN
Google: INDEX
Kernel: Didn't ask for this
Python Program: ..

那么问题就在于我们如何绕过内核?一种方法是通过ARP欺骗,就像我们有不同的IP地址一样。192.168.0.129

交易所现在如下所示:

me: sends packets for 192.168.0.129 to the address
router: goes through with it
my Python program: IN (from 192.168.0.129)
google: INDEX
kernel: this isn't my IP address! <ignore>
my Python program: uses ACK 

如果您注意到,这将起作用,我们现在可以发送数据包来获取响应,而不会受到内核的阻碍。

如何获取网页

为了防止谷歌为谷歌发送html,我们需要考虑以下几点:

蟒蛇的挫折

如果您注意到,一旦一切正常,使用 wireshark查看正在发送的数据包如下所示:

User/google: <tcp handshake>
User: GET google.com
google: 100 packets
User: 3 ACKs
google: <starts resending packets>
User: a few more ACKs
google: <reset connection>

在上述情况下,谷歌将发送比python程序可以处理的更快的数据包,发送ACK。然后,Google服务器将假定可能存在网络问题,导致用户无法确认数据包。

然后,这将重置连接,因为谷歌会决定存在连接问题。但我们确实知道连接很好,程序得到了充分的响应。这是一个 python 程序确认数据包缓慢的问题。

结论

我们遇到的挫折之一是 python 程序的速度太慢。正确理解与 TCP 相关的主要概念、它们的工作原理以及如何处理请求也很重要,因为这些将有助于确保您深入了解 TCP 的含义以及如何在遇到错误时解决错误。

标签:Python,控制协议,序列号
来源: