【2018深信服 醒狮计划】《网络协议》学习笔记

2018深信服“醒狮计划”笔记

第3周(5.07-5.13)

课程 必修 选修 基本要求
网络基础 TCP/IP模型,协议特点 《策略路由,Netfilter,iptables 开发知识培训讲义》 TCP、UDP、ARP、NAT、网关、网桥、VLAN、路由、抓包工具tcpdump/winshark

第一部分 Wireshark的使用

1. Wireshark安装

Ubuntu 16.04下安装网络流量分析工具 Wireshark 的方法

sudo apt-add-repository ppa:wireshark-dev/stable

sudo apt-get update

sudo apt-get install wireshark

【2018深信服 醒狮计划】《网络协议》学习笔记_第1张图片

如果没有弹出上面窗口,就运行下面命令行

sudo dpkg-reconfigure wireshark-common

如果想要使用命令行版本时,需要安装tshark

sudo apt-get install tshark

命令行抓取特定网卡和端口的包,

sudo tshark -i eth0 port 8080

现在是不成功的,需要先进行下面步骤,把权限先设置好

2. 权限/用户组设置

GUI:普通用户不能够打开网卡设备进行抓包,Wireshark不建议用户通过sudo在root权限下运行

【2018深信服 醒狮计划】《网络协议》学习笔记_第2张图片

解决方法

sudo vim /etc/group

“wireshark:x:130:”后面输入当前登录的用户名,我这里为“luojie”。提示:按i为插入,然后输入用户名,按esc,然后输入“:wq”进行保存。完成以上步骤之后,需要注销后重新登录来使设置生效,再次打开即可。

【2018深信服 醒狮计划】《网络协议》学习笔记_第3张图片

重启之后就能正常使用

【2018深信服 醒狮计划】《网络协议》学习笔记_第4张图片

3. 打开

键入wireshark就可以打开

wireshark

【2018深信服 醒狮计划】《网络协议》学习笔记_第5张图片

每次键入的话很不方便,所以可以右键图标,lock from Launcher就可以固定在桌面上了

【2018深信服 醒狮计划】《网络协议》学习笔记_第6张图片

4. Wireshark基本用法

Wireshark会捕捉系统发送和接收的每一个报文。如果抓取的接口是无线并且选项选取的是混合模式,那么也会看到网络上其他报文。

【2018深信服 醒狮计划】《网络协议》学习笔记_第7张图片

TCP/IP通过三次握手建立一个连接。这一过程中的三种报文是:SYN,SYN/ACK,ACK,第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了TCP三次握手的开始。
如果你找不到第一个SYN报文,选择Display Filter,输入过滤条件tcp.flags.syn==1,回车,显示的就是筛选之后的内容了。

【2018深信服 醒狮计划】《网络协议》学习笔记_第8张图片

因为学校限流量20G完全不够用,穷逼没钱上网,所以我的电脑配置了s+ipv6来进行(免流量上网+同时还自带梯子),所以截图里面的数据包都走的是本地ip,外部走的都是ipv6

第二部分 tcpdump的使用

0_0 不小心看岔了,Linux原来不用看wireshark…..

1. tcpdump -D 获取网络适配器列表

tcpdump -D

【2018深信服 醒狮计划】《网络协议》学习笔记_第9张图片

2. 抓取所有数据

sudo tcpdump -i <需要监控的网络适配器编号>

sudo tcpdump -i any

【2018深信服 醒狮计划】《网络协议》学习笔记_第10张图片

tcpdump详细命令

参数 命令
-i 参数指定监听网口
-c 参数指定监听的数据包数量
-s 参数指定监听数据包大小
-w 参数指定监听数据包写入文件

如果要监听某几台主机数据包 例如10.10.10.1020.20.20.2030.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

【2018深信服 醒狮计划】《网络协议》学习笔记_第11张图片

开始监听

sudo tcpdump host 47.95.47.253

【2018深信服 醒狮计划】《网络协议》学习笔记_第12张图片

刷新一下页面

【2018深信服 醒狮计划】《网络协议》学习笔记_第13张图片


如果想要获取主机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:80synsynack

tcpdump -i eth2 tcp[13]==2 or tcp[13]==18 and port 80 and host 10.10.10.10

第三部分 TCP/IP Internals

1. IP

1.1 IP数据封装图

【2018深信服 醒狮计划】《网络协议》学习笔记_第14张图片

1.2 IP包格式

【2018深信服 醒狮计划】《网络协议》学习笔记_第15张图片

名称 备注
version 4位版本号,目前为4
IHL 头部长度,4字节为单位
Tos 区分服务
TL 包括数据的总长度
Identification 标识
Flags 标记
Fragment Offset 分片偏移
TTL 数据包生存时间
Protocol 协议类型
checkSum 校验和

1.3 Time To Live(TTL)

  • 防止数据包在网络上环回
  • 由时间值变化为路由的跳数
  • 当TTL变0时,数据包被丢弃,ICMP Time Exceeded messages包发送给该数据包的源地址。

1.4 IP Fragment

  • MTU:链路层的特性决定了数据帧的最大长度
  • 标识:每个IP包的唯一值,相同的分片标识相同

    0 DF MF
  • DF: 0=可以分片 1=不可以分片出错时发送ICMP

  • MF: 0=最后一个分片 1=还有更多的分片在后面
  • 偏移:标识本包在整个包中的位置,以8字节为单位
  • 任何一片数据的丢失需要上层重传整个报文

1.5 Requirement in Transport Layer

  • 主机之间进程之间的传输 -支持多进程的并发
  • 保证可靠的数据分发
  • 必须按照上层发送数据的顺序有序传送
  • 对每个报文最多拷贝一次
  • 必须在接收方和发送方之间做到同步
  • 允许接收方对发送方进行流控

2. TCP

  • TCP

    • 所提供的服务:进程到进程的通信,基于字节流的,面向连接的,全双工的可靠的通信服务。
    • 端口
    • 三次握手、序列号、校验和、重传、确认
    • 滑动窗口
    • 流量控制
    • 拥塞控制
    • RAP(positive acknowledgement with retransmission)

    如果在协议中,发送方在准备下一个数据项目之前先等待一个肯定的确认,则这样的协议称为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.

2.1 TCP Model

【2018深信服 醒狮计划】《网络协议》学习笔记_第16张图片

2.2 TCP header

【2018深信服 醒狮计划】《网络协议》学习笔记_第17张图片

名称 备注
源端口/目地端口 各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选项。

2.3 Handshake

【2018深信服 醒狮计划】《网络协议》学习笔记_第18张图片

2.4 Closing A Connection

【2018深信服 醒狮计划】《网络协议》学习笔记_第19张图片

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

2.5 half-close

【2018深信服 醒狮计划】《网络协议》学习笔记_第20张图片

2.6 TCP State Machine

【2018深信服 醒狮计划】《网络协议》学习笔记_第21张图片

  • TCP options
  • 选项最长只能是40字节
  • 选项必须4字节对齐
  • 格式:
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签名

3. 流控

3.1 流量控制的两个极端

  • 一次发送一个字节(停等协议,效率极低)
  • 发送拥有的所有数据(可能使接收方来不及接收,原端也无法尽快知道数据包的丢失)

3.2 滑动窗口协议

  • 保证数据的可靠传递
    • 未确认的数据必须被发送方缓存起来
  • 保证数据的有序传输
    • 乱序的数据必须被接收方缓存起来
  • 提供End-to-End的流控机制
    • 发送方发送太快就必须阻塞等待

3.3 sliding windows

【2018深信服 醒狮计划】《网络协议》学习笔记_第22张图片

3.4 Nagle算法:

  • 发送端把从应用层收到的第一个数据发送出去
  • 发送完第一个后,发送端缓冲数据并等待,直到:a 收到上一次的确认;b 积累到MSS大小的数据。
  • 重复步骤2

【2018深信服 醒狮计划】《网络协议》学习笔记_第23张图片

3.5 Clark算法

  • 在缓存空间超过MSS之前或者缓存空间的一半变空之前,一直宣布窗口为0.

4. 差错控制

  • 通过校验和、确认和重传三个机制来保证
  • ACK:不消耗序列号,不需要确认
  • 原则:
    • 在发送数据时捎带确认,减少通信量
    • 延迟确认原则,同样是避免ACK报文段产生的过多报文段
    • 在任何时候不能有两个以上的按序的未被确认的报文段
    • 收到乱序报立即发送ACK
    • 当丢失的报文段到达时立即发送ACK
    • 收到重复的报文段立即发送ACK

4.1 重传

  • 重传定时器到或者3个重复ACK(快速重传)

4.2 Karn算法

  • 对重传的报文段不计算RTT

5. 拥塞控制

5.1 拥塞控制时的算法:

  • 慢启动
  • 拥塞避免
  • 快速重传

5.2 ACK原则之一:

  • 每一个乱序包均需要立即发送一个重复的ACK
  • 如果连续收到3个或以上的重复ACK,那么很有可能是有数据包丢失了

5.3 快速重传:

  • 当收到3个重复ACK时的措施
    • ssthresh=min(cwnd/2, 2)
    • cwnd=ssthresh+3
    • 如果再收到重复的ACK,cwnd+=1MSS,如果收到新数据的ACK,那么cwnd=ssthresh,重新进入加法增大的过程

5.4 恢复

  • 在快速恢复的状态中,收到新的数据ACK就退出快速恢复阶段。
  • Reno
    • 新的ACK表示不是和之前的ACK是同一个即可。
  • NewReno
    • 新的ACK是把所有的在进入快速恢复阶段的数据段全部确认。

5.5 RTT

  • RTT的真正含义:一个报文段从发送出去到收到确认的时间。

5.6 PAWS:(Protection Against Wrapped Seuence numbers)

  • 用时间戳和序列号两个标记来表示连接,相当于序列号从32位空间扩大到64位,防止在高速链路上序列号环绕

5.7 慢启动

【2018深信服 醒狮计划】《网络协议》学习笔记_第24张图片

6. 性能问题

T=1.2MSSPRTT 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:时延


6.1 影响性能

  • 1.窗口不够大,受头部16位限制
    • BDP=10Mbps*100ms=122.07KB,远远大于2^16=65536字节,极端下去就是停等协议。
  • 解决方法:

    • 窗口扩大选项,新增1个字节的移位计数器,实际窗口大小=16位的窗口值左移移位计数。
  • 2.窗口增长方式:加法增大,乘法减小

    • 1Gbps,100ms,BDP=12,500,000字节,按MSS 1500字节计算,需要增长到8333个包的拥塞窗口,也就是8333个RTT的时间。
    • 一旦出现丢包,窗口减半,那么又得重新开始增长,显然难以充分利用网络带宽。
  • 解决方法:TCP变种(HSTCP,BICTCP/CUBIC,FastTCP)


6.1 BIC TCP (Binary Increase Congestion control)

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.


6.2 慢启动

最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间 (Round Trip Time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低一点而已。我们可以简单计算下:


  • 开始 —> cwnd = 1
  • 1RTT —> cwnd = 2*1 = 2
  • 2RTT —> cwnd = 2*2 = 4
  • 3RTT —> cwnd = 4*2 = 8

如果带宽为W,那么经过RTT*log2W时间就可以占满带宽

6.3 拥塞避免

从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是 65536(同样以字节计算)。拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。

6.4 检测拥塞

首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为网络拥塞的主要依据是它重传了一个报文段。上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”
+ 把ssthresh降低为cwnd值的一半
+ 把cwnd重新设置为1
+ 重新进入慢启动过程。

原文:https://www.cnblogs.com/gofighting/p/5411702.html

6.5 时延的判断

时延:是数据(一个报文或分组,甚至比特)从网络或链路的一段传送到另一端所需要的时间。

发送时延:是从发送数据帧的第一个比特算起,到该帧的最后一个比特发送完毕所需的时间。
发送时延=数据帧长度(b) /信道带宽(b/s) [信道带宽就是数据率]
传播时延:电磁波在信道中需要传播一定的距离而花费的时间。
传播时延=信道长度(m)/电磁波在信道上的传播速率(m/s)
处理时延:主机或路由器处理所收到的分组的时间。
排队时延:分组在输入队列中排队等待处理,在输出队列中等待转发,就形成了排队时延。
总时延=发送时延+传播时延+处理时延+排队时延

6.6 速率的计算方法

我们知道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

6.7 DAIMD

DAIMD: An Improved Multimedia Stream Congestion Control Algorithm?

详情参考:https://www.atlantis-press.com/proceedings/meita-15/25838470

6.8 显式拥塞通告(ECN)

为了避免因为路由器拥塞而带来的丢包而产生的一系列问题,TCP/IP的设计者们创建了一些用于主机和路由器的标准。这些标准描述了在IP路由器上进行的主动队列管理算法(AQM)(RFC 2309),使得路由器能够监控转发队列的状态,以提供一个路由器向发送端报告发生拥塞的机制,让发送端在路由器开始丢包前降低发送速率。这种路由器报告和主机响应机制被称为显式拥塞通告(ECN)(RFC 3168)

详情参考:http://network.51cto.com/art/200901/107005.htm

6.9 前向纠错编码(FEC)

前向纠错编码(FEC),技术通过在传输码列中加入冗余纠错码,在一定条件下,通过解码可以自动纠正传输误码,降低接收信号的误码率(BER)。在WDM系统中,衡量FEC纠错能力的指标称为“FEC编码增益”,该增益越强表示纠错性能越强。

前向纠错技术(Forward Error Correction)在确保信号的长距可靠传输方面也起着非常重要的作用。相比于10G系统,100G的OSNR需要提高10倍,这需要多种技术的组合应用才能实现,其中就包括FEC。

详情参考:https://blog.csdn.net/u013566722/article/details/48374219

7. UDP

特征:
+ 提供给应用发送不可靠报文的选项,通常用于多播
+ 无需连接的概念,提供快速的数据发送
没有流控和拥塞控制

应用:TFTP、SNMP、DHCP、DNS、RIP、RTP

8. Linux下TCP实现分析

你可能感兴趣的:(Linux,TCP/IP,network,wireshark,tcpdump)