一个基于C-S的文件传输练习而引发的网络方面的思考

这几天跟着教主学习java的文件或流,网络编程等进阶知识。以便为寒假的项目实训:多文件传输项目做准备。对于数据在网络之间的传输,有了比较实在的理解,也渐渐懂得了tcp,udp,ip报文等知识,对于这些知识,之前只知表面,却不知具体应用和在编程中如何体现。现在,在教主的带领下,渐渐对这些知识有了更深一层的理解。我也深深地意识到了计算机网络的重要性,得开始着手准备学习了。如果幸运的你看到了我的这篇博客,不妨先看看我的这个博文(自己整理的):Web开发笔记(一):http协议相关内容,C/S与B/S,ip报文,TCP,UDP

根据运行结果,我发现,我的代码中,发送端客户端每次发送8M的文件块,而接收端服务器每次接收10M大小。开始我以为,通过文件流的read和write操作,这个文件就是以每次10M进行接收的。然而,我错了,输出read操作的返回值(即真正每次读取的大小),发现一个神奇的现象,TCP协议每次接收的大小不超过65536字节,即64K。

多亏教主,让我们多看看计算机网络的书,我还是知道一点TCP/IP协议的,每次接收的大小不超过64K的原因是!!!!!!!!理论上IP数据报(两字节)最长长度可达65536个字节!!!!!!

所以,如果采用UDP协议实现文件传输,你不能保证数据到了底层后,被UDP到底切割了多少,一块多大等等一系列问题,如果能解决每次发送了多少字节以及把丢的包重新发送等一系列繁琐的操作,那么,你就实现了一个TCP协议了,哈哈。

UDP是不管丢包,发送顺序等问题的,发送端正常的发,但是接收端是接收多少就显示多少,丢包后包是不会重新发送的。这一点体现在比如在qq或微信的语音聊天,视频聊天,斗鱼的直播等等。发送端是保证发送没问题,到了底层,往网络上写也是没问题的,但是,接收方就不能保证没问题了,这就是实时通信。

数据在广域网上传是要路由的,包在网络中走得路径是不一样的,每到一个节点,就存储起来,然后转发给另一个节点,这就叫存储转发。网络中的节点只能知道跟它连接的路由器的目的子网,只有一层,所以,在网络中,一个路由器能知道自己的目的子网和跟它直接连接的路由器的目的子网。

如果一直在网络中传输,离目的越走越远,那么,会发生什么情况?

最开始我以为是就在网络中无限的传输,但是,事实却不是这样的。IP数据报报头是有生命周期的,每过一个路由器就减1,等减为0还没有找到目的节点的话,这个包就被网络扔了,即“掉包”。

最后,上面的文件传输代码经过补充,已经可以完整的传输一个文件了,代码如下:你可以下载下来,导入idea运行查看结果,先运行test包下的TestReceiver,再运行TestSebder。

https://github.com/yangchaoy259189888/FileTransfer

好了,我要继续学习计算机网络了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章