Category Archives: 网络开发

TCP简单说下篇

本文摘自
https://www.kancloud.cn/kancloud/tcp/45893

TCP的RTT算法
从前面的TCP重传机制我们知道Timeout的设置对于重传非常重要。

设长了,重发就慢,丢了老半天才重发,没有效率,性能差;
设短了,会导致可能并没有丢就重发。于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
而且,这个超时时间在不同的网络的情况下,根本没有办法设置一个死的值。只能动态地设置。 为了动态地设置,TCP引入了RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。 听起来似乎很简单,好像就是在发送端发包时记下t0,然后接收端再把这个ack回来时再记一个t1,于是RTT = t1 – t0。没那么简单,这只是一个采样,不能代表普遍情况。

继续阅读

Posted in 网络安全, 网络开发 | Tagged , | Leave a comment

TCP 简单说上篇

本文转自:
https://www.kancloud.cn/kancloud/tcp/45892

TCP头格式
接下来,我们来看一下TCP头的格式

你需要注意这么几点:

TCP的包是没有IP地址的,那是IP层上的事。但是有源端口和目标端口。
一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。
注意上图中的四个非常重要的东西:
Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。
关于其它的东西,可以参看下面的图示

继续阅读

Posted in 网络安全, 网络开发 | Tagged | Leave a comment

为什么TCP头部没有数据长度信息而UDP有

ipv4_header

为什么TCP头部没有数据长度信息而UDP有

先让我们看看IP,TCP,UDP的头部结构

1. IPv4 头部

2. TCP和UDP头部

可以看到IP的头部包换数据的长度,TCP的头部不包含数据长度,UDP的头部则包含。

从信息冗余的角度来看,UDP的长度信息是不需要的。

因为IPv4的头部已经包含了数据的长度信息,这里的数据如果当前的通讯协议是UDP,那么这个长度就包含了UDP的头部和UDP的数据,因为UDP的头部长度固定为8字节,那么这样就很容易的算出UDP的数据的长度了。

继续阅读

Posted in 网络开发 | Leave a comment

强大的linux命令ncat

强大的linux命令ncat      

ncat是linux内置的一个命令,可以提供tcp,udp的服务器和客户端,还可以作为代理服务器。

所以如果测试,完全不用自己写一个tcp和udp的服务器,直接使用ncat就可以。ncat默认是工作于tcp模式,如果要工作udp,则使用 -u选项。下面介绍一些非常经典的应用。

继续阅读

Posted in Linux系统学习, 网络安全, 网络开发 | 4 Comments

Wireshark分析HLS流

Wireshark分析HLS流

关于HLS的介绍,前面我有专门写一篇博文介绍
HLS媒体流简要

本篇文章介绍如何使用Wireshark分析HLS流,

为了抓包的方便,我们就是在内部的一台机器设置HLS的媒体流服务器,关于如何假设HLS服务器,前面也有介绍:

利用nginx-rtmp-module搭建HLS流媒体服务器然后在另外一台服务器使用vlc或者ffplay客户端访问HLS流,然后Wireshark就可以抓取对应的包,因为我们确定知道我们服务器的地址,所以可以使用下面的过滤器过滤客户端机器和服务器之间的数据流

继续阅读

Posted in 网络开发, 视频技术研究 | Leave a comment

创建wireshark的自定义的协议分析插件

创建wireshark的自定义的协议分析插件

wireshark本身已经支持很多了的公共的协议,作为分析包的工具已经很强大了。

如果我们还想分析一下我们私有的协议,那么还可以开发插件。插件需要是C代码,其实官方有很详尽的文档,我就直接把链接放这里了。

继续阅读

Posted in 网络开发 | Leave a comment

设置笔记本为WiFi热点(hotspot)

设置笔记本为WiFi热点(hotspot)

设置笔记本为WiFi热点(hotspot)就是共享你的笔记本的网络,


run cmd.exe as administrator

// create new virtual network adapter
netsh wlan set hostednetwork mode=allow ssid=myhost key=12345678
// wiki ssid: myhost
// wiki connection password: 12345678

// to start hotspot network created just now
netsh wlan start hostednetwork
— The hosted network started.

继续阅读

Posted in 网络安全, 网络开发 | Leave a comment

如何通过Wireshark抓取媒体流的播放的URL

如何通过Wireshark抓取媒体流的播放的URL

Can one use wireshark to find the correct streaming url of a webradio, like http://www.chanson.ru/on-line.html? I would like to record their songs with audial one.

If one can find the url, how does one do it specifically (in detail please, I'm a newbie here)?

Thanks in advance gfheiche

继续阅读

Posted in 网络开发 | Leave a comment

UDP包的大小问题

UDP包的大小问题

我们传输数据的包的时候,需要包的大小。为什么呢?因为如果你的大包的大小超过了网络路径中的最大传输单元,也就是MTU

MTU=Maximum Transmit Unit

那么这个包在传输的时候就会出现碎片化处理(fragmentation),也就是在网络传输的时候,网络包被分成多个包传输,这样大大增加了数据包到达客户端后,因为丢失其中的某个包,而不能组成完整的包的几率。

关于网络分包的危害和所带来的问题,请想看IETF的文档:

https://tools.ietf.org/html/draft-mathis-frag-harmful-00

很多网络设备,如路由器的默认的MTU是1500,但是并不是所有的网络设备都是这个值,而网络路径中经过很多个设备,比如从中国到美国,整个这个网络路劲的MTU是由最小的值来决定的。那么到底取什么值才能保证呢?

根据国际IETF组织的建议,

如果网络是IPv4则是

576

IPv6则是

1280

这是整个IP包的大小,因此UDP包的大小还得减去IP头的大小-

IPv4=20字节

IPv6=40字节

而到UDP数据部分的大小,还得减去UDP头的大小-8字节

 

UDP Header
Offsets Octet 0 1 2 3
Octet Bit  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Source port Destination port
4 32 Length Checksum

关于IETF中建议部分是在TURN协议2.7看到:

https://tools.ietf.org/html/rfc5766

还有一种方法是采用测量的方法,就是实际传输数据之前测试到底包达到多少的时候会出现分包现象。

这种方法IETF也有提出对应的解决方案:

https://tools.ietf.org/html/rfc1191

对应的RFC号是1191,其中提到基本思想是:

利用IP包头的DF标志位,设置标志位为1,表示不要分包,如果从源到目的地的整个路径中有任何一个router,网络设备,其MTU小于这个包的大小,那么将返回一个ICMP包,告诉源 – “目标不可达”。

下面RFC1191中的原话:

The basic idea is that a source host initially assumes that the PMTU
   of a path is the (known) MTU of its first hop, and sends all
   datagrams on that path with the DF bit set.  If any of the datagrams
   are too large to be forwarded without fragmentation by some router
   along the path, that router will discard them and return ICMP
   Destination Unreachable messages with a code meaning "fragmentation
   needed and DF set" [7].  Upon receipt of such a message (henceforth
   called a "Datagram Too Big" message), the source host reduces its
   assumed PMTU for the path.

继续阅读

Posted in 网络开发 | Leave a comment

比telnet更强大的工具netcat

比telnet更强大的工具netcat

今天使用telnet发现如果远程的主机的端口没有开的情况下,就出现了等待的很长时间的问题,在我的linux的机器测试的结果是要等超过3分钟。有人说是10秒,显然不是。

而telnet的参数列表中根本就没有一个可以指定timeout的时间。

继续阅读

Posted in 网络安全, 网络开发 | 2 Comments