课程 | 必修 | 选修 | 基本要求 |
---|---|---|---|
网络基础 | TCP/IP模型,协议特点 | 《策略路由,Netfilter,iptables 开发知识培训讲义》 | TCP、UDP、ARP、NAT、网关、网桥、VLAN、路由、抓包工具tcpdump/winshark |
Ubuntu 16.04下安装网络流量分析工具 Wireshark 的方法
sudo apt-add-repository ppa:wireshark-dev/stable
sudo apt-get update
sudo apt-get install wireshark
如果没有弹出上面窗口,就运行下面命令行
sudo dpkg-reconfigure wireshark-common
如果想要使用命令行版本时,需要安装tshark
sudo apt-get install tshark
命令行抓取特定网卡和端口的包,
sudo tshark -i eth0 port 8080
现在是不成功的,需要先进行下面步骤,把权限先设置好
GUI:普通用户不能够打开网卡设备进行抓包,Wireshark不建议用户通过sudo在root权限下运行
解决方法
sudo vim /etc/group
在
“wireshark:x:130:”
后面输入当前登录的用户名,我这里为“luojie”
。提示:按i为插入,然后输入用户名,按esc
,然后输入“:wq
”进行保存。完成以上步骤之后,需要注销后重新登录来使设置生效,再次打开即可。
重启之后就能正常使用
键入wireshark就可以打开
wireshark
每次键入的话很不方便,所以可以右键图标,lock from Launcher就可以固定在桌面上了
Wireshark会捕捉系统发送和接收的每一个报文。如果抓取的接口是无线并且选项选取的是混合模式,那么也会看到网络上其他报文。
TCP/IP通过三次握手建立一个连接。这一过程中的三种报文是:SYN,SYN/ACK,ACK,第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了TCP三次握手的开始。
如果你找不到第一个SYN报文,选择Display Filter,输入过滤条件tcp.flags.syn==1
,回车,显示的就是筛选之后的内容了。
因为学校限流量20G完全不够用,穷逼没钱上网,所以我的电脑配置了s+ipv6来进行(免流量上网+同时还自带梯子),所以截图里面的数据包都走的是本地ip,外部走的都是ipv6
0_0 不小心看岔了,Linux原来不用看wireshark…..
tcpdump -D
sudo tcpdump -i <需要监控的网络适配器编号>
sudo tcpdump -i any
tcpdump
详细命令
参数 | 命令 |
---|---|
-i | 参数指定监听网口 |
-c | 参数指定监听的数据包数量 |
-s | 参数指定监听数据包大小 |
-w | 参数指定监听数据包写入文件 |
如果要监听某几台主机数据包 例如
10.10.10.10
、20.20.20.20
、30.30.30.30
tcpdump host 10.10.10.10 and \(20.20.20.20 or 30.30.30.30\)
试一下抓取一下网页数据包,就拿
CSDN
试一下 IP是47.95.47.253
开始监听
sudo tcpdump host 47.95.47.253
刷新一下页面
如果想要获取主机
210.27.48.1
除了和主机210.27.48.2
之外所有主机通信的ip包
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
如果获取
10.10.10.10:80
发出去的数据包
tcpdump -i eth0 src host 10.10.10.10 and src port 80
如果获取发往
10.10.10.10:80
的数据包
tcpdump -i eth0 dst host 10.10.10.10 and dst port 80
只抓取
syn
包
tcpdump -i eth0 tcp[13]==2
只抓取
fin
包
tcpdump -i eth2 tcp[13]==1
只抓取
synack
包
tcpdump -i eth2 tcp[13]==18
抓取
10.10.10.10:80
的syn
、synack
包
tcpdump -i eth2 tcp[13]==2 or tcp[13]==18 and port 80 and host 10.10.10.10
名称 | 备注 |
---|---|
version | 4位版本号,目前为4 |
IHL | 头部长度,4字节为单位 |
Tos | 区分服务 |
TL | 包括数据的总长度 |
Identification | 标识 |
Flags | 标记 |
Fragment Offset | 分片偏移 |
TTL | 数据包生存时间 |
Protocol | 协议类型 |
checkSum | 校验和 |
MTU
:链路层的特性决定了数据帧的最大长度标识
:每个IP包的唯一值,相同的分片标识相同
0 | DF | MF |
---|
DF
: 0=可以分片
1=不可以分片
,出错
时发送ICMP
MF
: 0=最后一个分片
1=还有更多的分片在后面
偏移
:标识本包在整个包中的位置,以8字节为单位重传
整个报文TCP
如果在协议中,发送方在准备下一个数据项目之前先等待一个肯定的确认,则这样的协议称为PAR
TCP provides reliability by doing the following:
- The application data is broken down into what TCP considers the best sized chunks to send. The unit of information passed by TCP is called a segment
- When TCP sends a segment it maintains a timer, waiting for the other end to acknowledge reception of the segment. If an acknowledgement is not received in time, the segment is retransmitted.
- When TCP receives data from the other end of the connection, it sends an acknowledgement. This acknowledgement is normally not sent immediately but delayed a fraction of a second.
- TCP maintains a checksum on its header and data. This is an end-to-end checksum whose purpose is to detect modification of the data in transit. If a segment arrives with an invalid checksum, TCP discards it and does not acknowledge receiving it.
- Since TCP segments are sent as IP datagrams, and since IP datagrams can arrive out of order, TCP segments can arrive out of order. A receiving TCP resequences the data if necessary, passing the received data in the correct order to the application.
- Since IP datagrams can be duplicated, a receiving TCP must discard duplicate data.
- TCP also provides flow control.
名称 | 备注 |
---|---|
源端口/目地端口 | 各16位,标识应用程序的端口号,取值范围:0~65535。 |
序列号 | 这个32位字段定义本报文段第一个数据字节的序列号。TCP对每个数据字节都有一个编号,初始序列号(ISN)在连接建立的时候随机产生。 |
确认号 | 这个32位字段定义了接收端期望从对方接收的序号。确认号可以和数据捎带在一起发送。 |
头部长度 | 表示头部4字节为单位的长度,头部最长为15*4=60字节。 |
保留 | 6位,在当前的Linux实现中只有4位。 |
控制位 | ↓ |
–> URG | 紧急指针有效 |
–> ACK | 确认字段有效 |
–> PUSH | 立即推送数据,大多数情况被忽略 |
–> RST | 连接复位 |
–> SYN | 连接建立的复位 |
–> FIN | 终止连接 |
–> ECE(ECN-Echo) | 标识支持显示拥塞通知(RFC3168) |
–> CWR(Congestion Window Reduced) | 窗口降低标记,表明自己已经降低了发送速度(RFC3168) |
窗口值 | 16位,表明接收方的接收窗口大小,用于流控 |
校验和 | 强制性使用,覆盖TCP头部和数据 |
紧急指针 | 当URG有效时,该16位有效。把紧急指针+序列号可以得到报文段中最后一个紧急数据字节。 |
可选项 | 最多40个字节,常见的有时间戳选项、窗口扩大选项、最大报文长度选项、SACK选项。 |
16:02:47.162871 IP 59.66.122.66.23 > 59.66.24.89.49219: F 11540:11540(0) ack 97 win 5792 <nop,nop,timestamp 35945029 949674616>
16:02:47.162936 IP 59.66.24.89.49219 > 59.66.122.66.23: . ack 11541 win 65535 <nop,nop,timestamp 949674616 35945029>
16:02:47.164937 IP 59.66.24.89.49219 > 59.66.122.66.23: F 97:97(0) ack 11541 win 65535 <nop,nop,timestamp 949674616 35945029>
16:02:47.166552 IP 59.66.122.66.23 > 59.66.24.89.49219: . ack 98 win 5792 <nop,nop,timestamp 35945029 949674616>
ack=F+1
Kind(8位) | Length(8位) | Content |
---|
类型 | 备注 |
---|---|
kind=0 | EOP选项结束标记 |
kind=1 | NOP无操作,用于4字节对齐的填充 |
kind=2 | MSS选项 |
kind=3 | 窗口扩大选项 |
kind=4 | SACK Permitted选项 |
kind=5 | SACK数据选项 |
king=8 | 时间戳选项 |
kind-19 | MD5签名 |
a
收到上一次的确认;b
积累到MSS
大小的数据。RTT
Reno
NewReno
T=1.2∗MSSP√∗RTT T = 1.2 ∗ M S S P ∗ R T T
Avg(cwnd)=1.2P√ A v g ( c w n d ) = 1.2 P
+ T:吞吐量
+ p:丢包率
+ RTT:时延
解决方法:
2.窗口增长方式:加法增大,乘法减小
解决方法:TCP变种(HSTCP,BICTCP/CUBIC,FastTCP)
BIC TCP is one of the congestion control algorithms that can be used for Transmission Control Protocol (TCP). BIC is optimized for high speed networks with high latency: so-called “long fat networks”.
BIC has a unique congestion window (cwnd) algorithm. This algorithm tries to find the maximum where to keep the window at for a long period of time, by using a binary search algorithm.
最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间 (Round Trip Time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低一点而已。我们可以简单计算下:
如果带宽为W,那么经过RTT*log2W时间就可以占满带宽
从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是 65536(同样以字节计算)。拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。
首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为网络拥塞的主要依据是它重传了一个报文段。上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”
+ 把ssthresh降低为cwnd值的一半
+ 把cwnd重新设置为1
+ 重新进入慢启动过程。
原文:https://www.cnblogs.com/gofighting/p/5411702.html
时延:是数据(一个报文或分组,甚至比特)从网络或链路的一段传送到另一端所需要的时间。
发送时延:是从发送数据帧的第一个比特算起,到该帧的最后一个比特发送完毕所需的时间。
发送时延=数据帧长度(b) /信道带宽(b/s) [信道带宽就是数据率]
传播时延:电磁波在信道中需要传播一定的距离而花费的时间。
传播时延=信道长度(m)/电磁波在信道上的传播速率(m/s)
处理时延:主机或路由器处理所收到的分组的时间。
排队时延:分组在输入队列中排队等待处理,在输出队列中等待转发,就形成了排队时延。
总时延=发送时延+传播时延+处理时延+排队时延
我们知道1个千兆端口的线速包转发率是1.4881MPPS,
百兆端口的线速包转发率是0.14881MPPS,这是国际标准,但是如何得来的呢?
具体的数据包在传输过程中会在每个包的前面加上64个(前导符)preamble也就是一个64个字节的数据包,原本只有512个bit,但在传输过程中实际上会有512+64+96=672bit,也就是这时一个数据包的长度实际上是有672bit的千兆端口线速包转发率=1000Mbps/672=1.488095Mpps,约等于1.4881Mpps,百兆除于10
为0.14881Mpps那么以后很简单了,其实直接用设备参数中的pps数值乘以672那么就转化成我们比较能理解的大众化的bps概念了。
一般销售为了方便大家计算和整数化的理解就改672为500。
传输速率
bps(bits per second)
1M带宽的意思是1Mbps
注意是bps
而不是Bps
!换算吧,1Bps=8bps;
所以1Mbps=128KBps;
所以下载速度最高为128KBps
1Mbps=1024KBps/8=128KBps
DAIMD: An Improved Multimedia Stream Congestion Control Algorithm?
详情参考:https://www.atlantis-press.com/proceedings/meita-15/25838470
为了避免因为路由器拥塞而带来的丢包而产生的一系列问题,TCP/IP的设计者们创建了一些用于主机和路由器的标准。这些标准描述了在IP路由器上进行的主动队列管理算法(AQM)(RFC 2309),使得路由器能够监控转发队列的状态,以提供一个路由器向发送端报告发生拥塞的机制,让发送端在路由器开始丢包前降低发送速率。这种路由器报告和主机响应机制被称为显式拥塞通告(ECN)(RFC 3168)
详情参考:http://network.51cto.com/art/200901/107005.htm
前向纠错编码(FEC),技术通过在传输码列中加入冗余纠错码,在一定条件下,通过解码可以自动纠正传输误码,降低接收信号的误码率(BER)。在WDM系统中,衡量FEC纠错能力的指标称为“FEC编码增益”,该增益越强表示纠错性能越强。
前向纠错技术(Forward Error Correction)在确保信号的长距可靠传输方面也起着非常重要的作用。相比于10G系统,100G的OSNR需要提高10倍,这需要多种技术的组合应用才能实现,其中就包括FEC。
详情参考:https://blog.csdn.net/u013566722/article/details/48374219
特征:
+ 提供给应用发送不可靠报文的选项,通常用于多播
+ 无需连接的概念,提供快速的数据发送
没有流控和拥塞控制应用:TFTP、SNMP、DHCP、DNS、RIP、RTP