30天自制操作系统吧 关注:1,381贴子:4,721

在铁娃娃OS上试做网络通讯实验

只看楼主收藏回复

以前曾经用RTL8019做过网络通讯实验,现在与铁娃娃OS连接起来,做网络通讯实验、
这是实机接收到远程电脑发来的ping命令时,接收到的数据流的模样。

远程电脑与本机用交叉网线连接。远程电脑是普通的XP系统,在DOS窗口下输入:ping 192.168.1.25。
本机的IP的地址设置为 192.168.1.25。从上图看,网络已经连上,并收到packet数据了。
远程电脑的浏览器如果输入http://192.168.1.25 可以打开本机提供的一张简易网页。
做上面的实验时,逐渐唤起已经忘记的网络通讯数据传输的一些基础知识,术语的记忆。
比如IP地址,MAC地址,ARP,ICMP,DHCP,UDP,TCP,IP协议......。


IP属地:上海1楼2021-07-06 21:30回复
    接收到ping命令后的动态图


    IP属地:上海4楼2021-07-08 09:46
    回复
      第二步:
      拟采用PC接口的网卡RTL8029AS,取代上面的RTL8019AS。
      首先要搜索电脑中网卡RTL8029AS,找出其配置空间和基地址。
      RTL8029的DeviceID是8029,VenderID是10ec。
      基地址是0xc100。


      IP属地:上海6楼2021-07-14 22:16
      回复
        PCIbus的网卡的基地址不是固定的,插在不同的电脑,或不同的插槽上,都可能会变化。
        所以,只有上电后,用枚举的方式,搜索电脑上所有的PCI设备,才能确定。
        枚举的方法是: 用这个地址 0x80000000 |(bus << 16)|(dev << 11)|(func << 8)
        bus从0至255,dev从0至31,func从0至31,全部搜索(读取)一遍。如果读到0x802910ec,就算找到了。
        基地址是上面0x802910ec的地址+ 0x10。
        因为,RTL8029AS与RTL8019AS一样,都与传统的NE2000兼容。对本人来讲,理解起来就方便的多。
        后来发展的网卡,可能已经不再照顾兼容NE2000。需要阅读data sheet后,才能搞懂其工作原理。
        下图是在QEMU虚拟机上搜索RTL8029AS网卡的情况。实机搜索时,基地址是0xe800。

        下一步(第三步)是在RTL8029AS网卡基础上,从接收数据中分离出IP(0800)和ARP(0806)


        IP属地:上海7楼2021-07-15 10:05
        收起回复
          RTL8029AS与RTL8019AS一样,与传统的NE2000兼容。这对于网络底层编程的入门来说,倒是一个捷径。
          要熟读并理解下表的各寄存器的用途和使用方法。

          主要必用的寄存器都在Page0,Page1和Page2中。Page3的寄存器可暂忽视。
          留意其中的一些寄存器的读/写在不同的Page中,如RCR,TCR,DCR,IMR,PSTART,PSTOP。
          这大半个月里,都在看奥运节目。现在已尘埃落定。中国军团的金牌总数以一枚之弱,排在美国之后。这也与
          当今中美两国的综合实力相对应。
          下一步,在RTL8029AS网卡上构筑传输层以下的各个通讯协议。

          如果顺利完成的话,再在应用层方面拓展。


          IP属地:上海8楼2021-08-08 18:54
          回复
            铁娃娃系统实现对ping命令的响应:
            在网络上检验连接对方电脑的简单方法是用ping命令。
            设访问电脑用XP系统的IP为:192.168.1.20,把铁娃娃的系统的IP地址设置为:192.168.1.25。
            在XP电脑上键入ping命令 : ping 192.168.1.25 <Enter>后,
            1,XP电脑首先发送ARP 数据包至网上。数据包里面含有XP电脑的IP地址和MAC硬件地址,和企图访问对象的IP地址(即192.168.1.25),因为不知道对象的MAC地址,所以用FF-FF-FF-FF-FF-FF代替。
            2, 铁娃娃系统通过网卡收到这个数据包后,分析出这是给我的数据包。于是响应回送一个ARP 回复数据包,告诉
            对方我的IP地址的MAC地址是多少。
            3,XP系统得到了访问对象的响应,并知道对象的MAC地址后,就发送一个IP数据包,内部是一个ICMP数据。
            4,铁娃娃系统通过网卡收到IPCM数据包后,回复ICMP数据包。
            5,XP系统收到ICMP数据,与自己的ICMP packet比对,如果完全一致,则正式确认与对方建立起网络连接。
            ping命令会连续尝试发送4次与对方连接。见下图。

            四次访问都得到相应,没有丢失内容。TTL=255不是指TTL电平,应该是与数据包在网络上的生命时间有关。


            IP属地:上海10楼2021-08-15 21:47
            回复
              接上文。
              ping命令涉及到底层的通讯协议,就是ARP协议和IP协议。IP协议中有ICMP,RAPP,UDP和TCP。
              下图是调试过程中,铁娃娃系统接收到XP电脑发来的数据和回复的数据。以及RTL8029AS各主要寄存器的内容。

              以后桌面上的这些数据是要去掉的。
              下一步的计划是:
              1,在IP协议基础上搭建UDP协议。有了UDP协议后,可以使两台电脑之间通过网络进行数据通讯。
              比如像“微信”那样打文字传给对方。
              2,搭建TCP协议,它比UDP要复杂很多,但能保证传输数据准确无误。


              IP属地:上海11楼2021-08-15 22:03
              回复
                搭建UDP(User Datagram Protocol)
                UDP的架构与ping命令中用到的ICMP很相似,前面部分是相同的,只要把其中的ICMPHead换成UDPHead。
                看下面的两者对比:
                ICMP: 接收方的MAC,发送方MAC,Ethertype(0800),IPHead,ICMPhead,ICMP数据部分。
                UDP: 接收方的MAC,发送方MAC,Ethertype(0800),IPHead,UDPhead,UDP数据部分。
                UDPhead的构成:
                发送方的Port号,接收方Port号,UDPhead长度,UDP的Checksum。
                构成是很简单的啊,通讯双方的port号不能相同,按常规我选Port号为1001和1002。
                UDPhead的长度就是IP head长度:0x12。
                UDP的checksum: 计算IPhead中0x12个字节。
                UDP数据部分: 就是向对方发送的数据。不需要参与checksum计算。
                UDP的特点是结构简单,通讯直接。发出去的数据,对方有没有收到是不管的。收到的数据是不是正确
                也是不管的。所以用在聊天程序中是合适的,最多是看到的是一串意味不明的乱码,不会酿成大祸。
                这是简易聊天程序。第一步是按[连接],也就是arp操作。连接好后,就可以通讯了。

                比如我发送12345:
                下面是接收方收到的数据:
                00 02 cb 02 11 7d 00 23 18 bf 8c 80 08 00 45 00
                00 26 01 6a 00 00 40 11 f5 df c0 a8 01 14 c0 a8
                01 19 03 ea 03 e9 00 12 52 6f 31 32 33 34 35
                UDP head及数据部分是:
                03 ea 03 e9 00 12 52 6f 31 32 33 34 35
                03 ea是1002的16进制数。
                0012是长度。
                526f是checksum。
                UDP通讯的确是很简单。
                现在,铁娃娃系统一侧已经收到"12345"并显示在桌面上,收到之后并自动回复一串字符作为回应。
                chat程序能正常收到。
                如果在铁娃娃系统上添加一个chat的app,那就可以输入文字聊天了。
                因为目的是为了调试UDP,所以暂时不做chat APP了。
                下一步,是在铁娃娃系统里搭建TCP协议。就是我们常看到或听到TCP/IP网络通讯中最重要的部分。
                这是一个很复杂的工作。


                IP属地:上海12楼2021-08-22 21:45
                回复
                  TCP比UDP要复杂得多了,也是很关键的一步。
                  TCP与UDP都是传输数据的。UDP有点像是在信封上写好地址和收件人姓名投到邮筒,对方能不能收到,就管不了了。只有收到对方回信后才知道。可靠性差。还有一个不同的是TCP通讯的双方的关系是有Server与Client区别。Client向Server通讯时,首先需要建立连接,也就是要做一个“三次握手”的工作。
                  1,Client 发SYN: 田鼠,我是土豆。
                  2,Server发SYN+ACK: 田鼠收到土豆的握手信号。
                  3,Client 发ACK:土豆收到田鼠的回应信号。
                  这样Server与Client双方都确认收到对方的信号后,才正式建立连接,缺一不可。
                  稍稍有些麻烦的是计算checksum。UDP中也有checksum,是对一组连续数据进行计算。即使sum算错,也不
                  影响。
                  TCP的checksum要计算不同位置数据及参数的组合,如果算错发送出去,对方是就不会回应的。
                  还有就是每条信息含有SeqNo和AckNo。也是有点搞脑子,不同的命令算法不一样。如果搞错了,对方也是不会回应。调试程序就难一些,因为不知道错在哪里,对方不理我。
                  所以搭建TCP协议,首先要过“三次握手”这一关。


                  IP属地:上海13楼2021-08-28 19:32
                  回复
                    用一个TCP的Client的chat程序。至少它发出来的数据流是可以信赖的,先看看铁娃娃收到的数据是否一致。

                    目标: 如果[连接]按钮激活,说明“三次握手”成功。


                    IP属地:上海14楼2021-08-28 19:51
                    回复
                      调试TCP建立连接的“三次握手”,好像是三级跳远。但比三级跳远难,除了三个落脚点外,下面不是平地,
                      而是深沟。中间任何失误,就掉到沟里去了。没有后面的事了。
                      幸运的是三个信号中,铁娃娃只要发送一个信号就可以,而且是排在第二跳。第一跳由Windows的TCP的
                      chat软件,或者用浏览器完成。这就能保证第一个握手信号是可以信赖的。铁娃娃只要收到这个标准的信号,
                      里面的数据格式,checksum肯定都是正确的。只要参照这个格式,计算好checksum(SEQ,ACK不一样)
                      回送出去就可以了。只要能收到第三个信号,就连接上了。
                      说起来容易,实际上还是颇费波折。


                      IP属地:上海15楼2021-08-29 23:17
                      回复
                        接上页。
                        tcp的3way handshake完成连接之后,双方就可以相互传输数据。每传输一次数据,仍然需要得到对方的收到
                        ACK,并回复ACK+FIN表示收到了你的ack。这样才能保证传输数据的可靠性。缺点就是效率比较低。
                        下面是用xp电脑的标准浏览器,访问“铁娃娃”(IP地址:192.168.1.25)后,获得的网页数据后的显示模样。

                        网页是很简陋的。网页制作是另外一个领域了,这里仅用来证明tcp协议的通讯构成已经完成了。
                        下面的SW test 是以前HTML文本留下来的东西,与这次实验没有关系。现在无任何功能。
                        不过,据此我有个想法:把网页上按钮扩大到[上][下][左][右]四个,网络远程操作铁娃娃上“推箱子”的小孩
                        的移动方向。由XP电脑的浏览器操纵来完成游戏。这样就蛮有意思的。
                        (待续)


                        IP属地:上海16楼2021-09-05 08:55
                        回复
                          这是铁娃娃上面的“仓库番”游戏的画面,现在还只是要用键盘操纵。下一步是希望用另外
                          一台电脑Windows上的浏览器操纵。也就是通过网络远程操纵。实现起来不会太难,但会
                          蛮有趣的。


                          IP属地:上海17楼2021-09-05 09:12
                          回复
                            经过改造的浏览器操作界面:

                            按钮的尺寸很小,也不知道怎么可以做得大些。这无关紧要,只要鼠标能点上去就可以了。
                            这是台式机,用RTL8029AS网卡(PCI)。“仓库番”,走了第一步的画面


                            IP属地:上海18楼2021-09-05 17:52
                            回复
                              试着上动画,画面比较小,我也看不清楚。


                              IP属地:上海19楼2021-09-05 17:56
                              回复