首先解释一下这个题目, “报文”指的是业务层自定义的报文, TCP是流式协议, 不像UDP那样是报文协议.
某两个系统间进行网络交互, 请求报文的格式为:
<json串>&sig=xxx
请求方用PHP的stream_socket_sendto()进行发送. 服务器端使用Python的twisted框架. 上线后, 出现问题, 服务器端接收到的报文不完整. 例如, json串只读了一半, 或者缺少”&sig=xxx”, 缺少的数据是随机的, 但只缺少尾部, 已经接收到数据没有差错.
Continue reading »
Written by ideawu
at 2009-10-22 19:21:02 | tags: TCP
这似乎是一个非常简单的话题, 就跟”是个人就能做网站”一样, 你可能也认为”是个人就能写使用TCP socket的网络程序”. 不过, 下面介绍的几个基本的原理的做法, 你可能并没有理解.
TCP是一种流式的协议, 简单的说, TCP不检查数据的语义, 更不会检查数据的边界. 而应用层一般使用的是报文协议. 为此, 产生了一些特定的用法和模式.
有几种方式可用来实现报文协议:
1. 明确声明报文数据的长度.
2. 使用分隔符.
3. 发送方发送完数据后关闭连接.
第3种是socket的特定用法.
Continue reading »
Written by ideawu
at 2009-10-12 15:15:52
fdevent是一套方便的跨平台IO多路复用C语言接口, 主要想法来自 epoll 和 lighttpd 的 fdevent, 接口的使用几乎和 epoll 一样.
示例
while(1) {
nfds = fdevents_wait(evs, 1000);
if(nfds == 0){
//printf("timeout\n");
continue;
}
for(i = 0; i < nfds; i++) {
fde = evs->events[i];
if(fde->flags & FDEVENT_IN){
// ...
}
if(fde->flags & FDEVENT_OUT){
// ...
}
}
}
项目主页: http://www.ideawu.net/person/fdevent/
Written by ideawu
at 2009-06-25 16:21:28
StunLink 用 C# 语言编写, 可以穿透绝大多数 NAT 和防火墙, 在局域网中的传输速度能达到 8M/s 的速度, 它基于 UDP, 使用与 TCP 类似的滑动窗口机制保证可靠传输. StunLink 的使用方法很简单:
StunLink link = new StunLink();
link.RemoteInfo["IP"] = "1.2.3.4";
link.RemoteInfo["Port"] = "20000";
link.RemoteInfo["Password"] = "einj8ds1mx2";
try{
link.Connect();
}catch{
// 连接失败.
}
// Connect 方法成功返回后已经建立了连接.
byte[] buf = ...
link.Send(buf);
int len = link.Receive(buf);
...
Written by ideawu
at 2008-06-20 10:13:29
一个比较常见的误解就是, 认为即时消息必须是 P2P 方式的. 这并不是普遍情况. 对于最具代表性的文本通讯, QQ, XMPP 等都不是 P2P 的, 而是经过中转服务器中转. 下面是可能的原因:
- P2P 连接并不总是能建立, 也就是说在某些情况下 P2P 是不可行的.
- 假设这样的情况, 一个节点向另一个节点发送了一条消息, 然后过了一个小时又发送另一条消息. 这是很常见的情况. 如果使用 P2P, 那么就需要在这一个小时内保持一条 P2P 连接(如 TCP 连接)或者建立两次连接. 这显示增加了系统的复杂性, 不如通过中转服务器进行中转简单.
- 通讯记录有时需要被保存和过滤(可能是政府的要求).
还有就是带宽问题. 在某些情况(有时是常见的)下, A 与 B 直接连接的带宽并不比 A 和 B 之间经过 R 中转的带宽高. 有一次我和一位朋友要传输大概 100 MB 的文件, 开始我们使用了聊天工具的 P2P 传输, 发现速率只有几 K. 后来我决定让他把文件传到我的网站空间的 FTP 上, 然后我再到该 FTP 上取. 估算的速率有 500 K 以上.
带宽问题是由基础网络造成的. 有一个极端的例子, 我经过美国的节点中转数据的速率要比在同一个城市内的网通和电信之间的直接通信要快得多!
还有一个比较重要的例子就是 HTTP 代理服务器, 我们花钱通过一个代理服务器来访问某些网站, 以代替我们直接连接这些网站的服务器.
Written by ideawu
at 2008-05-18 18:59:36
传输协议是客观存在的, 即使你的传输不使用任何已经公开的协议, 你也是在使用一种未公开的协议. 传输协议必须保证基础的要求:
- 错误控制
- 流量控制
数据常常可以划分为帧(或者报文, 分段等), 假设报文的在传输中不会出现损坏, 报文要么丢失, 要求完整地到达目的. ARQ(Automatic Repeat reQuest )是一种错误控制机制, 但是也常常具有流量控制的功能.
ARQ 有如下几种: Stop-and-wait ARQ(停止等待 ARQ), Go-Back-N ARQ(回退 N 帧 ARQ) and Selective Repeat ARQ(选择重传 ARQ).
Stop-and-wait ARQ 是其它两种的基础. 其隐含了"一个传输例程的 Stop-and-wait ARQ"这样的意思. Go-Back-N ARQ 是"多个传输例程的 Stop-and-wait ARQ", 并且为了管理这些例程, 额外添加了其它的协议.
Written by ideawu
at 2008-04-08 12:33:33
Recent Comments