茱莉亚·伊万斯

第21天:尝试TCP

今天我开始尝试编写TCP堆栈。在蟒蛇中。我们会看看这是不是个好主意。

我在用斯卡皮.我谈到丑闻星期四–它是在Python中处理低级网络内容的一个很好的工具。

所以。我已经得到了TCP握手的工作。这样做的方式是发送一个SYN,然后拿回一个SYN-ACK,然后发送一个确认。

我首先尝试了这个TCP握手代码:

Dist=谷歌source_port+=1#我们需要在每个timeip_header=IP(dst=dest)ans=sr1(ip_header/TCP(dport=80)设置不同的源端口,标志=S”,seq=..randint(0,1000)#发送SYN,接收SYN-ACKreply=ip_header/TCP(dport=80,SEQ = ANS.ACK,ack=ans.seq+1,标志=A#ACKsend(回复)#Send ACK

这没用。在检查Wireshark之后,结果是我的机器出了问题:当我从Google收到一个SYN-ACK包后,它正在发送一个RST(复位)包。怎么了??

好,我的机器上已经有了一个网络堆栈,就像什么是SYN-ACK包?我没有要求这个!“.所以它会重置连接。

Jari(谁是令人惊讶的)提出了一个解决办法:设置一个假IP地址并使用ARP告诉路由器。以前我就是那个IP地址的人。这是固定版本:

我想我也可以在这里使用iptables告诉内核忽略这些数据包。但是我现在很害怕iptables。所以。这个代码工作得更好了!!

#Set port&MAC addressFAKE_IP="“100.4.4”#使用其他人不会拥有的MAC_ADDR="60:67:20:eb:7b:bc#我的实际MAC地址#广播我们的假IP地址ff:ff:ff:ff:ff:ff"/ARP(psrc=FAKE_IP,hwsrc=MAC_ADDR))source_port+=1ip_header=IP(dst=dest,src=FAKE_IP)#将源端口设置为ans=sr1(ip_header/TCP(dport=80,sport=source_port,标志=S”,seq=..randint(0,#SYN#ans是SYN-ACKreply=ip_header/TCP(dport=80,sport=source_port,SEQ = ANS.ACK,ack=ans.seq+1,标志=A#ACKsend(reply)#Send ACKpkt=ip_header/TCP(dport=80,sport=source_port,Seq=Real.Seq,标志=美联社““/”GET/HTTP/1.1rnrn”#发送我们的真实数据包发送(pkt)

这是我今天少量的代码。我还花了很多时间读书。4.4BSD网络栈的UDP处理代码关于这一点,我还没有什么聪明的话要说,但是很有趣。