惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园_首页
博客园 - 【当耐特】
小众软件
小众软件
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
Vercel News
Vercel News
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threatpost
人人都是产品经理
人人都是产品经理
H
Help Net Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 热门话题
B
Blog
F
Full Disclosure
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Threat Research - Cisco Blogs
L
LangChain Blog
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Project Zero
Project Zero
I
InfoQ
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Cloudflare Blog
V
Vulnerabilities – Threatpost
云风的 BLOG
云风的 BLOG
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
K
Kaspersky official blog
WordPress大学
WordPress大学
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Securelist
T
Tenable Blog
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
O
OpenAI News
Blog — PlanetScale
Blog — PlanetScale
量子位
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
P
Proofpoint News Feed

博客园 - KeithDan

Windows 8开发 WinRT 对ZIP文件解压缩及文件夹的ZIP压缩 wp应用发布,金宝贝点读 WP7游戏分裂细胞 WP7游戏方块夺宝 C#手工解析XML xeno tactic 2 完整版 Lua扫雷 惊人!天下奇闻“鹏” 今天很郁闷 HighLightCode1.2——开源项目 代码着色--关于循环与分组 代码着色--开源系列 利用非托管dll实现多平台加密 非托管dll的需要注意的地方 page_load执行两次 transfer object (3) transfer object (1) 中国象棋(网络版) 人生的阶梯
transfer object (2)
KeithDan · 2007-10-27 · via 博客园 - KeithDan

上次谈到如何传输图象
那么如果是文件呢?很显然不能使用序列化的模式,因为序列化其实是把数据序列到内存中,随着数据的增大,对内存的占用也会加大,所以这是不可取的.
对于文件传输,对于TCP/IP协议传输比较简单,那么我们可以把他们读到FileStream里面,通过文件流读取的方法.那么今天我想说的是关于UDP模式下对于文件安全传输的问题.什么是UDP?UDP是数据报,它不需要知道对方是否在线,只考虑单方面的发送或者接收,那么它对于TCP/IP协议的优势在于效率很高,但是确不能保证数据的准确传输.
那么在UDP协议要对文件安全传输怎么办呢?这就是今天讨论的话题.
首先我们了解了UDP协议的特性以后,那么我们将考虑如何做到数据发送和接受安全.这里的先讲是接收.
我们必须要考虑的几个问题:
1.文件是否都收到了?
2.文件是否有重复部分?
3.如果有多个文件,那么第2个文件的数据头在那里?
面对这3个问题,应该说是在UDP传输里面很重要的.
1文件收到与否,我们可以比队文件的大小,那么我们首先需要知道待传输的文件总大小是多大?那么我们可以在传输数据加上一个数据头
    数据大小(64)|实际数据
我们在接收以后,首先知道该文件大小,读取实际数据

2但是大家会发现,在UDP应用当中,仅靠大小的比对是很不准确的.因为在UDP协议下,漏包是平常的事,于是为了补上遗漏的数据包,我们会采用包的重发(这个在后面讲解).于是就有重复的数据包,为了能够准确的得到我们的数据,那么我们可以对每个数据包编号
    包1:(0|数据)
    包2:(1|数据)
    包3:......
通过包的序号我们得到所有的包,对于重复的包是我们所不需要的,需要丢弃,而其余的包我们写入文件流.当然,在这个过程我们需要把包头和数据分离,按照包头的顺序写入数据.那么具体有多少个包呢?我们接收的包只是顺序正确,那最后的包是不是都接收完了呢?那么我们可以通过文件的长度来计算包的个数,以确保包的数量正确.

3对于这个问题来说,可能有朋友没明白.我们的发包通过fs.Read方法从文件流里读取到一定的字节,那么最后一个可能不够我们申请的字节,那么再读下一个文件
 文件1: 
    包1:512byte
    包2:512byte
    包3:200byte    注意,在第3次读取,也就是文件1的末尾不足我们申请的字节,只有200,那么我们发送的是200字节
 文件2:
    包4:512byte    
    包5:512byte
    包6:300byte
我们在发送的过程包3只有200byte,那么接收呢,他也是这样接收的吗?很显然不是,你会收到如下的包
    bag1:512byte
    bag2:512byte
    bag3:512byte
    bag4:512byte
    bag5:500byte
很显然,文件1和文件2的发送的包在接收时合为一起了.那么这时我们必须在最后发送包加以结束标志.将拆分包3,一段作为文件1的组成部分,一段作为文件2的开始部分.
    包3:200byte->file1    312byte->file2

这里我们讲的是接收问题,主要是理论和算法实现方面,后面将讲解发送部分的实现,以及实际开发的问题
当然,这里只讲了一些基础理论,对于实际的应用还有很多需要考虑的地方,如发送来的文件名,缓存数据等等
至于实现的代码整理以后随后贴出