Calvin's Marbles


  • 首页

  • 关于

  • 归档

  • 标签

  • 搜索

libutp源码简析

发表于 2017-12-05

libutp是uTorrent使用的类似TCP的传输层实现。它基于UDP提供可信的、有序的点对点的传输,并具有最少的时延。需要注意的是utp和另一个基于UDP的传输协议QUIC的实现思路和优势并不一样,例如QUIC更强调连接建立的快速性,建立连接时只需要1至2次握手,又如QUIC将TLS整合到协议中,实现了0RTT,而基于HTTP2的协议需要2/3RTT。QUIC还允许在用户层面配置各种拥塞控制算法。
网上有关libutp实现的介绍几乎没有,因此我打算就其源码做一个简单的分析。这里要注意UTP是基于包的而不像TCP是基于流的,虽然它提供的API还是基于流的。这样有一些影响,例如黏包问题的处理、缓冲区的管理(例如可以去掉PUSH标记)、窗口管理、重新分组等方面。

uTP源码简介

utp.h以 C89 的形式提供接口。例如 utp_write 是以 proactive 的方式实现的。
utp 相关的实现大多在 utp_internal.cpp 文件中。
utp_packedsockaddr.cpp 中封装了 sockaddr_in 结构。
ucat.c 基于 uTP 框架构建了一个基础的应用。
uTP 的设计主要是异步的,应用代码不会阻塞在异步 IO 操作上,而是指定回调函数并立即返回。utp_callbacks.cpp中注册了各种回调函数,utp 向外界传输消息都是以这里回调的形式开展的。例如当收到数据包时,ctx->callbacks[UTP_ON_READ] 这个回调函数就会被调用。

阅读全文 »

TCP的可靠传输

发表于 2017-12-05

本文作为一个专题来讨论TCP可靠传输的实现,其中部分论述迁移自TCP的流量控制和拥塞控制。

阅读全文 »

TCP的流量控制和拥塞控制

发表于 2017-12-05

本文作为一个专题来讨论TCP的流量控制和拥塞控制,其中部分论述迁移自libutp源码简析。有关可靠传输的实现,详见TCP的可靠传输。

流量控制着眼于接收端,保证发送端的发送速率能够匹配接收端的接受速率和缓存大小。流量控制包含滑动窗口 rwnd 、Nagle算法等。拥塞控制着眼于整个网络的性能,是当前发送端的速率匹配当前链路能承载的的限额。拥塞控制包含拥塞窗口 rwnd 、慢启动、拥塞避免、Fast retransmit 和 Fast recovery 等。

阅读全文 »

TCP套接字编程

发表于 2017-12-02

介绍 TCP 套接口编程。

阅读全文 »

UDP套接字编程

发表于 2017-12-02

UDP协议是相对于TCP协议不是面向连接的,也是不可靠的,因此UDP套接字编程在思路上和TCP套接字编程很不一样。

阅读全文 »

数据挖掘简易复习

发表于 2017-11-21

《数据挖掘》课程简易复习提纲,主要根据 PPT 整理。时间仓促,不排除存在部分内容爆炸。

阅读全文 »

C++ functor 和 lambda

发表于 2017-11-17

介绍 C++ lambda、仿函数、std::function 等。

阅读全文 »

Google Kickstart 2017 Round C题解

发表于 2017-11-14

C轮感觉比校招笔试轮次的DE要简单点了,这次有四道题都很有意思。

阅读全文 »

C++内存对齐与多态

发表于 2017-11-08

最近在看Inside the C++ Object Model,一种日经面试题,求sizeof(A)

1
2
3
4
5
6
7
8
9
10
struct A{
char c;
int i;
long long ll;
int j;
virtual void f(){};
};
struct B{

};

这种题目其实考的知识点很多,包含了虚函数虚继承、内存对齐等一系列C++的语言特性。

阅读全文 »

Google Kickstart 2017 Round E题解

发表于 2017-11-06

E轮是Google的校招笔试轮次了。

阅读全文 »
1…141516…25
Calvin Neo

Calvin Neo

247 日志
153 标签
RSS
GitHub Twitter Weibo
Links
  • xqq
  • wenwen
  • zyyyyy
© 2015 - 2025 Calvin Neo   Hosted by Coding Pages
版权声明
由 Hexo 强力驱动
主题 - NexT.Muse