第一天1 总述:

TCP 使用不可靠的IP服务提供一种可靠的运输层服务
UDP 不可靠,适用于:
实时流量:语音视频流;查询DNS;数据传输:TFTP 停止等待协议。

以太网数据帧长范围是46-1500,小于46要用0来填充,大于1500要分片(MTU分片)
以太网的帧首部有一个16bit的帧类型域(ip,arp,rarp)
IP在首部中存入一个长度为8bit的数值,称作协议域(icmp,igmp,tcp,udp,esp,gre)
TCP和UDP都用一个16bit的端口号来表示不同的应用程序(ftp,telnet,http)

以太网协议号:
IP:0x0800 ARP:0x0806    PPPOE:0x8863 0x8864
IP协议号:
ICMP:1    TCP:6    UDP:17    GRE:47    ESP:50    AH:51


第一天2 数据链路层:

以太网和IEEE 802封装: 帧结构图如下:

TCP/IP详解卷一 学习笔记_TCP/IP

环回口:

127网段都是环回地址。
传给广播地址或多播地址的数据报复制一份传给换回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身。

TCP/IP详解卷一 学习笔记_TCP/IP_02

MTU:

MTU是计算出方向。
2台通信主机路径中的最小MTU,它被称为路径MTU。路径MTU在2个方向上不一定是一致的。

以路径MTU发送数据不会产生分片。

在路径中多次分片,在目的端重组装。


IP协议:

IP提供不可靠、无连接的服务。

不可靠:IP仅提供最好的传输服务

无连接:不维护任何关于后续数据报的状态信息

TCP/IP详解卷一 学习笔记_TCP/IP_03

一些特殊的IP地址:

TCP/IP详解卷一 学习笔记_TCP/IP_04

ARP:
设备驱动程序从不检查IP数据报中的目的IP地址,是根据48位的MAC地址发的。
TCP/IP详解卷一 学习笔记_TCP/IP_05

代理ARP:

纯2层设备(no ip routing)访问任意地址都会进行ARP请求,3层设备要看路由表。

免费ARP:

主机发送ARP查找自己的IP地址叫做免费ARP
免费ARP可以有两个方面的作用:
1)一个主机可以通过它来确定另一个主机是否设置了相同的I P地址。
2)如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。


ICMP:

ICMP帧结构:

TCP/IP详解卷一 学习笔记_TCP/IP_06

TCP/IP详解卷一 学习笔记_TCP/IP_07

I C M P的一个规则是, I C M P差错报文(参见图6 - 3的最后一列)必须包括生成该差错报文的数据报I P首部(包含任何选项),还必须至少包括跟在该I P首部后面的前8个字节
一个重要的事实是包含在U D P首部中的内容是源端口号和目的端口号。就是由于目的端口号( 8 8 8 8)才导致产生了I C M P端口不可达的差错报文。接收I C M P的系统可以根据源端口号(2 9 2 4)来把差错报文与某个特定的用户进程相关联。


Traceroute:

Traceroute是一个UDP协议,思科的设备端口号是33434
traceroute 工作原理:
我们现在可以猜想一下Tr a c e r o u t e程序的操作过程。它发送一份T T L字段为1的I P数据报给目的主机。处理这份数据报的第一个路由器将T T L值减1,丢弃该数据报,并发回一份超时I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到T T L值为1的I P数据报,也不会丢弃该数据报并产生一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?
Tr a c e r o u t e程序发送一份U D P数据报给目的主机,但它选择一个不可能的值作为U D P端口号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的U D P模块产生一份“端口不可达”错误(见6 . 5节)的I C M P报文。这样,Tr a c e r o u t e程序所要做的就是区分接收到的I C M P报文是超时还是端口不可达,以判断什么时候结束。

Tracert 发的是ICMP echo request包


IP选路:

ip routing 设备不会参考ICMP重定向信息,redirect信息

no ip routing 设备会根据ICMP重定向信息添加对应路由表。

重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由
表中可以只有一个默认表项。一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。I C M P重定向允许T C P / I P主机在进行选路时不需要具备智能特性,而把所有的智能特性放在路由器端。


第三天1 UDP:

TCP:面向数据流,TCP会把数据包进行拆分、重组装以后再封装成IP报传输,有自己的长度大小。
UDP:面向数据报的传输层协议,应用层进程的每个输出操作都正好产生一个UDP数据报,并组成一个待发送的IP数据报。应用程序必须关系IP数据报的长度,如果它超过网络的MTU,那么就要对IP数据报进行分片。(容易产生大数据)

TCP/IP详解卷一 学习笔记_TCP/IP_08

TCP/UDP的端口号尽管相互独立,如果TCP和UDP同时提供某种知名服务,2个协议通常选择相同的端口号。这纯粹是为了使用方便,如DNS的53端口。
rsh 和 syslog 514端口。
UDP的校验和校验UDP的首部、数据和UDP伪首部(包含了源目IP地址)。IP的校验和只校验IP首部。
UDP往返包的校验和相同,交换了源目IP地址以后校验结果一样,可以看出算法比较简单。
在发送第一份数据报之前,发送端和接收端之间没有任何通信。
当收到数据时,接收端没有任何确认。
UDP有3大应用:
1. 查询类(DNS)
2. 实时流量(语音 视频流)
3. 传输数据 (TFTP--停止等待协议)


IP分片:
IP把MTU与数据报长度进行比较。
在发送端和中间设备都有可能产生IP分片,在目的地重组。重组装由目的端IP层完成,目的是使分片和重组装对传输层是透明的。

IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时相互独立。
尽管IP分片过程看起来透明,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。所以要经常避免分片。
分片的第一片中包括完整的头部,后续的分片只包含IP首部,不包含其他首部(如UDP首部的端口号)。
IP数据报是指IP层端到端的传输单元(分片之前重组之后),分组是IP层和链路层直接传送的数据单元。

TCP/IP详解卷一 学习笔记_TCP/IP_09

TCP/IP详解卷一 学习笔记_TCP/IP_10


第三天2 UDP续:


广播多播:

广播与多播只应用于UDP。TCP是一个面向连接的协议,意味着分别运行于2主机内的2进程间存在一条连接,肯定是单播。


广播、多播的传输过程:

物理网卡接收的帧类型:
1. 目的mac是本机MAC地址或广播、多播的帧
2. 混合模式下,接收每个帧

TCP/IP详解卷一 学习笔记_TCP/IP_11

接收到帧以后,验证校验和。验证不通过则丢弃,通过则发给设备驱动程序。
设备驱动程序收到帧以后,进行多播过滤。(不过滤广播)
IP层进行IP地址过滤。(ACL)
UDP收到数据报,就根据目的端口进行过滤,如果目的端口没有应用程序侦听则丢弃包。

从以上可以看出组播比广播优化,组播在设备驱动程序被过滤,广播要到UDP根据目的端口进行过滤,广播更消耗资源。


smurf攻击:发送ICMP echo,源是被攻击服务器,目的是广播。

组播地址格式:

TCP/IP详解卷一 学习笔记_TCP/IP_12

多播组地址范围:224.0.0.0到239.255.255.255。
MAC地址范围:01:00:5e:00:00:00到01:00:5e:7f:ff:ff。

由于多播组号中的最高5 bit在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。32 个不同的多播组号被映射为一个以太网地址。

既然地址映射是不唯一的,那么设备驱动程序或IP层(见图12-1)就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。


DNS:

一般查询DNS用UDP,区域传送用TCP,TC位置位的时候可以用TCP查询。

TFTP:
TFTP的代码适合只读存储器,程序小。 TFTP端口:UDP69,但是确认信息的端口是随机的
停止等待,每次传输固定大小512字节(除最后一个包),
防火墙如果要放行TFTP,因为确认消息端口随机,所以要inspect TFTP
TFTP要指定目录,因为没有认证等安全机制。所以一般TFTP要限制只能访问特定目录下的文件,有安全隐患。


第四天1 TCP:

TCP提供一种面向连接、可靠的字节流服务。

TCP/IP详解卷一 学习笔记_TCP/IP_13

TCP通过下列方式来提供可靠性:
1.应用数据被分割成T C P认为最适合发送的数据块。这和U D P完全不同,应用程序产生的数据报长度将保持不变
2.当T C P发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。在
3.当T C P收到发自T C P连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒
4.T C P将保持它首部和数据的检验和。
5.T C P将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
6.既然I P数据报会发生重复, T C P的接收端必须丢弃重复的数据。
7.T C P还能提供流量控制。T C P连接的每一方都有固定大小的缓冲空间。(窗口)

TCP也可以描述为没有选择确认或否认的滑动窗口协议。


TCP连接的建立与终止:

TCP/IP详解卷一 学习笔记_TCP/IP_14

建立过程:3次握手

1) 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1415531521)。这个SYN段为报文段1。
2) 服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。


ISN:当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。系统初始化时初始的发送序号被初始化为1。这个变量每0.5秒增加64000,并每隔9.5小时又回到0(不通的操作系统增长方式不一样)。

ASA对默认初始化序列号扰乱。
R1-----ASA------R2  
关闭ISN序列号扰乱
打开option19选项(md5通过option19放过)
穿越ASA的BGP md5验证可以通过


连接终止:4次握手
因为T C P连接是全双工,因此每个方向必须单独地进行关闭。所以需要4次握手。


TCP连接超时:

0-2(2)-6(4)-14(8)-30(16) 超时重传时间机制
连接后使用ACL限制访问流量:不会超时,一直重传


MSS (最大报文段长度):
默认MTU1500,MSS值为1500-40=1460
Server----Router-----Client
Router设置MTU800、Server设置MTU1000、Client设置MTU1000.
TCP连接协商时候,MSS为960,Server以MTU1000发包,DF位被置1,Router返回ICMP不可待信息。ICMP不可达信息里面标识MTU为800,后续Server以MSS760发包。
server会记录Path MTU,所以当把router的MTU改为1500以后,Server会直接用760发包。(重启机器以后记录清除)。


TCP状态迁移图:

TCP/IP详解卷一 学习笔记_TCP/IP_15

TCP/IP详解卷一 学习笔记_TCP/IP_16

2MSL:
MSL:是任何报文段被丢弃前在网络内的最长时间
当T C P执行一个主动关闭,并发回最后一个A C K,该连接必须在T I M E WA I T状态停留的时间为2倍的M S L。这样可让T C P再次发送最后的A C K以防这个A C K丢失(另一端超时并重发最后的F I N)。
T C P连接在Time_Wait的时候,5元组是不能被使用的。

平静时间:
T C P在重启动后的M S L秒内不能建立任何连接。这就称为平静时间(quiet time)。
只有极少的实现版遵守这一原则,因为大多数主机重启动的时间都比MSL秒要长。

RST:
客户端发送FIN处于FIN_WAIT状态以后,如果长时间没收到服务器发来的FIN信息,知名防火墙会进行监控,在一段时间以后给客户端发送TCP RST复位包释放客户端连接。

异常关闭:

连接一个端口不可达消息时收到:
UDP:ICMP unreachable
TCP:RST消息

RST的2个好处:
1.收到RST以后,丢弃所有待发送数据报
2.RST接收方区分另一端执行的是异常关闭还是正常关闭,并且提供异常关闭的手段。


TCP交互数据流:

按分组数据流计算,约有一半的TCP报文段包含成块数据(FTP),另一半则包括交互式数据(telnet)。
按字节计算,成块数据与交互数据的比例约为90%和10%。
交互式数据的工作原理:

TCP/IP详解卷一 学习笔记_TCP/IP_17

TCP/IP详解卷一 学习笔记_TCP/IP_18

通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200 ms 的时延等待是否有数据一起发送。


Nagle算法:
一个TCP连接上最多只能有一个未被确认的未完成的小分组(类似TFTP的停止等待)。低俗链路下可以启用,延迟会高。
路由器启用命令:service nagle。
需要关闭nagle算法的例子:
小消息(鼠标移动)必须无时延,一些功能键F1等。

第五天1:TCP成块数据流:
流量控制方法:TFTP的停止等待协议、TCP的滑动窗口协议。滑动窗口协议允许发送方在停止等待确认前可以连续发送多个分组,加速数据传输速率。
快的发送方和慢的接收方:
滑动窗口:

TCP/IP详解卷一 学习笔记_TCP/IP_19

当窗口至少有2个报文段时,会发窗口更新消息


慢启动:
局域网中,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口(通告窗口)大小为止。如果发送方和接收方之间存在多个路由器和速率较慢的链路时,中间路由器可能会缓存或丢包。
现在TCP支持一种慢启动的算法。通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而工作。
接收方的通告窗口,发送方的拥塞窗口。当与网络中另一主机通信时,发送方设置拥塞窗口为1个报文段,没收到一个ACK,拥塞窗口就加1个报文段。最后以拥塞窗口和接收窗口的最小值作为发送上限。
发送一个分组的时间取决于2个因素:传播时延(光速、传输设备等待时间)和媒体速率(媒体每秒可传输比特数)的发送时延。在速率较慢的情况下,发送时延起主要作用,在千兆比特速率下,传输时延占主要地位。

TCP/IP详解卷一 学习笔记_TCP/IP_20

TCP的超时重传:
4个定时器:
对每个连接,TCP管理4个不通的定时器:
重传定时器:重传时间将近9分钟。指数退避 往返时间。
坚持定时器(persist)
保活定时器(keepalive)
2MSL定时器


拥塞避免算法是一种处理丢失分组的方法
该算法假定由于分组受到损坏引起的丢失是非常少的(远小于1%),因此分组丢失意味着在源主机和目的主机之间的某处网络上发送了拥塞。


常见协议分析
FTP/TELNET/HTTP/SMTP/POP3/SSL/SNMP/语音协议

FTP:
2个信道:控制信道、数据信道。
2个模式:active mode、passive mode

active mode:第二信道由服务器主动建立的
第一信道控制信道:3次握手,连接服务器21端口。罗列目录、下载数据都通过第二信道完成。
第一信道,客户端会发送PORT(a,b,c,d,e,f)的包,第二信道时,服务器主动发起,源端口20,目的IP:a.b.c.d,目的端口:e*256+f

passive mode:第二信道由服务器被动接受客户主动发起
控制信道:
3次握手,客户端源端口随机,目的端口21
客户端给服务器发送PASV探测是否支持passive mode
服务器回Port(a,b,c,d,e,f)信息
数据信道:
源端口随机端口,目的端口根据服务器Port信息(源目IP都是随机)

动态应用
防火墙或NAT设备对FTP的影响
show xlate
show conn
show ip table trans


Telnet: 不安全
SSH:配置SSH:
配置域名:ip domain name XXX
crypto key generate rsa modulus 1024 配置密钥 (最少要1024位,一般用2048,默认的512不推荐)
username XXX password XXX 定义用户名密码 (15级不用加密)
enable secret
line vty 0 15
login local
transport input ssh

HTTP:
HTTP主要特点:
哑服务器
瞬时协议
URL: http://www.tudou.com/programs/view/htFLzseY3VI/
protocal:http
host:www.tudou.com
URI:/programs/view/htFLzseY3VI/

http://www.baidu.com/s?wd=乾颐堂&ie=utf-8&f=8&rsv_bp=1

wd:argument name argument 乾颐堂:value

由于http是瞬时协议,用户的行为是连续的,所以需要cookie来把不连续的操作串联起来。
多连接
防火墙对80进行清洗,监测是否包含HTTP该有的格式


SSL 安全套接层
SSL用于保障TCP-based安全
DTLS 支持UDP
client Hello 发送一堆支持的算法给服务器
服务器选一些算法给客户端
服务器给客户端发送证书,客户端验证证书的有效性,证书里面包含了服务器的公钥。
客户端产生随机数,用公钥加密,把密文发给server,server用私钥解密,得到密钥。


SNMP: