1.计算机网络体系结构
层次参考模型
5 | 应用层:各种应用层协议如DNS、HTTP、POP、TELNET、FTP、SMTP等 |
---|---|
4 | 运输层(TCP或UDP):向 两台主机中进程之间的通信 提供 通用的数据传输 服务 ,,使用的中间设备叫 网关 |
3 | 网络层:(IP、ARP、RARP、ICMP)把运输层产生的报文或用户数据报封装成 分组 或 包 进行传送 ,在TCP/IP体系中也叫 IP数据报 ,使用的中间设备如: 路由器 |
2 | 数据链路层:将网络层传下来的数据报组装成帧,使用的中间设备如: 网桥、桥接器 |
1 | 物理层:(Ethernet、FDDI令牌环) 数据传输的单位是比特,使用的中间设备如: 转发器 |
数据在各层析之间的传递过程
1.1TCP/IP协议
- 是Internet的主体,进行数据交换所遵循的网络通信协议,是与Internet有关的一些列网络协议的综合
1.1.1 IP协议
- 是整个internet的基础协议,负责分配IP地址,提供路由。不提供差错控制,只使用报头的校验码,不提供重发和流量控制
- 是整个internet的基础协议,负责分配IP地址,提供路由。不提供差错控制,只使用报头的校验码,不提供重发和流量控制
- IP地址:实际上是标志一台主机(或路由器)和一条链路的接口
1.1.2 ARP(address resolution protocol)协议
- 地址转换协议,在 同一个局域网内 负责将网络层的IP地址转换为数据链路层的物理地址
- 1.主机A广播ARP请求分组
- 2.局域网上所有运行的ARP进程都收到此请求
- 3.主机B单播响应,其他主机忽略
- 4.主机A在其ARP高速缓冲中写入B的地址映射
1.1.3 RARP(reverse address resolution protocol)协议
- 即反向地址转换协议,作用与ARP相反,负责将物理层地址转换为IP地址。允许主机从网关服务器的ARP表或者缓存上请求主机的IP地址,不过这个协议现在已经基本淘汰不用了
1.1.4 ICMP(internet control messages protocol)协议
- 即Internet控制报文协议,负责发送消息,报告错误,主要用于在主机与服务器之间传输控制信息(路由是否可达,网络通不通),ping命令与tracert命令就是基于ICMP协议的
- 对于”ping of Death”(长度大于64K)
- 在路由器上对ICMP数据报进行带宽限制
- 在主机上设置ICMP数据报的处理规则,最好是拒绝所有的ICMP数据报
1.1.5网际组管理协议IGMP(Internet Group Management Protocol)
2.IP协议
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 参考文档:链接文本
IP header: http://tools.ietf.org/html/rfc791#section-3.1
3.用户数据报协议UDP
- UDP是无连接的:减少了开销和发送数据之前的延时
- UDP使用尽最大努力交付:不需要维护复杂的连接状态表
- UDP是面向报文的:既不合并也不拆分
- UDP没有拥塞控制:网络出现拥塞时不会降低源主机的发送速率
- UDP支持一对一、一对多和多对多的交互通信
- UDP的首部开销小,只有8字节,TCP首部有20字节
4.TCP(Transmission Control Protocol)协议
- 参考文档:链接文本
- 4.1服务器端口号:链接文本
- (0~1023):又叫熟知端口号
- (1024~49151): 登记端口号
- (49152~65535):客户端使用的端口号
- 4.2 传输控制协议TCP概述
- 1.TCP是面向连接的传输协议:虚链接(也就是逻辑连接)
- 2.每条TCP连接只能有两个端点
- 3.TCP提供可靠交付:无差错、不丢失、不重复、并且按序到达
- 4.TCO提供全双工
5.面向字节流:仅将上层应用交下来的数据看成 无结构的数据流,流指的是 流入到进程或从进程流出的字节序列
4.3 TCP的连接
1.TCP把连接作为最基本的抽象
2.套接字 socket = (IP地址:端口号)
3.每一条TCP连接唯一的被通信两端的两个端点(即两个套接字)所确定
4.自动重传请求ARQ(Automatic Repeat reQuest):重传请求是自动进行的
5.连续ARQ协议和滑动窗口( TCP的精髓 )1.累计确认:接收方对按序到达的最后一个分组发送确认
2.详细笔记看后面
- 4.4 TCP报文段的首部格式
- 源端口/目地端口:各16位,标识应用程序的端口号,取值范围:0~65535。
- 序列号:这个32位字段定义本报文段第一个数据字节的序列号。TCP对每个数据字节都有一个编号,初始序列号(ISN)在连接建立的时候随机产生。
- 确认号:这个32位字段定义了接收端期望从对方接收的序号。确认号可以和数据捎带在一起发送。注意:若确认号为N,则表明:到序号N-1为止的所有数据都已正确收到
- 头部长度(数据偏移):表示头部4字节为单位的长度,头部最长为15*4=60字节。
- 保留:6位,在当前的Linux实现中只有4位。
- 控制位(置1时):
- URG:紧急指针有效
- ACK:确认字段有效
- PUSH:立即推送数据,大多数情况被忽略
- RST:连接复位,出现严重差错时使用(如主机崩溃或其他原因)
- SYN:连接建立时用来同步序号。置一时不能携带数据,但消耗序号
- FIN:终止连接
- ECE(ECN-Echo):标识支持显示拥塞通知(RFC3168)
- CWR(Congestion Window Reduced):窗口降低标记,表明自己已经降低了发送速度(RFC3168)
- 窗口值:16位,表明接收方的接收窗口大小,用于流控
- 校验和:强制性使用,覆盖TCP头部和数据
- 紧急指针:当URG有效时,该16位有效。把紧急指针+序列号可以得到报文段中最后一个紧急数据字节。
- 可选项:最多40个字节,常见的有时间戳选项、窗口扩大选项、最大报文长度选项、SACK选项。
- 窗口:指发送报文段的一方的接收窗口,作为让对方设置发送窗口的依据
- 选项字段(长度)可变[kind(8位),length(8位),Content]
kind:选项类别 length:选项的数据总长度 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签名
- 选项:长度可变,最长可达40字节
1.最初只有一种选项:MSS->数据字段的最大长度(不包括首部)->为了提高传输效率尽量不让IP数据报分片
2.窗口扩大选项:16位窗口字段最大64K,在卫星信道网络不够用,占3个字节,其中一个移位值S(最大14),相当于窗口增加到2^(16+14)-1个字节
3.时间戳选项
–3.1.用来精确计算往返时间RTT
–3.2.用于处理TCP序号超过2^32的情况,又称为放置序号绕回,在高速率时有用(2.5Gbits/s)
4.选择确认(SACK)
—–>选项字段最长只有40字节,需要一个字节指明SACK选项,一个指明要占多少字节,剩下38字节最多传送4个边界(一个边界占4字节),注意:坐边界指出字节块的第一序号,右边界减一才是字节块的最后一个序号[1501,3001]共1500字节 - 4.5 TCP的运输连接管理
- 保活计时器(Keep-alive):服务器每收到一次数据就重新设置保活计时器,通常是两个小时
- Persistence(Probe)定时器:解决ACK丢失可能造成的死锁问题
- TIME_WAIT定时器:2MSL
4.6 TCP可靠传输的实现
1.A的发送窗口不一定和B的接收窗口一样大
—-1.1 网络传送窗口有滞后
—-1.2 拥塞时A的窗口会减小
2.对于不按序到达的数据:TCP通常临时存储到窗口中,等缺少的字节到齐后再交付上层应用
3.关于确认
—-TCP要求接收方必须有累积确认,但推迟时间不超过0.5s
—-可以在有数据发送时捎带上
4.超时重传时间的选择
1.加权平均往返时间RTTs=(1-a)(旧的RTTs)+a(新的RTT样本)—->a=0.125
2.超时重传时间RTO=RTTs+4*RTTd
3.RTT的偏差的加权平均值RTTd=(1-b)(旧的RTTd)+b|RTTs-新的RTT样本|—->b=0.25
—–>重传时不采用RTT样本,而是把RTO增大一倍5.Nagle算法(一次发一个字节的情况)
1.先发送第一个字节,后面的先缓存起来,等前一个的确认收到后再发送
2.当数据达到发送窗口的一半或者已达到报文段的最大长度时也要发送6.糊涂窗口综合征(接收方缓存已满,而进程一次只读一个字节)->clark算法
1.可以让接收方等待一段时间,等到可以容纳一个最长报文或者缓冲区有一半空闲的时候
2.发送方不要发送太小的报文段,而是把报文段累积到足够大,或者达到接收方缓存一半大小的时候再发送4.7 TCP的拥塞控制:防止过多的数据注入到网络中,使路由器或链路不致过载
1.慢开始:发送方维持一个拥塞窗口(cwnd)
1.新的RFC 5681把初始cwnd设置为2~4个SMSS*(Sender Maximum Segment Size)
2.拥塞窗口cwnd每次的增加量 = min(N,SMSS)
——>N值刚被收到的确认报文段所确认的字节数
3.慢开始门限
——>cwnd4.9 tcpdump常见用法
1.详细命令:
- -s :从每个报文中截取snaplen字节的数据
- $tcpdump -s 0 :显示全部数据包
- -c:指定要抓取的包的最终数量。
- -i:指定tcpdump要监听的接口
- $ tcpdump -i lo :抓取回环网口的包
- $ tcpdump -D :查看可用的接口
- $ tcpdump -i eth1 port 25
- $ tcpdump -i eth1 src port 25
- $ tcpdump -i eth1 net 192.168 :抓取的网络号是192.168
- $ tcpdump -i eth1 arp :抓ARP包
- -n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。
- -nn:除了-n之外,还把端口显示为数值。
- -w:指定监听数据包写入文件
- -XX:以16进制和ASCII方式输出包的头部数据。
- -vvv:很详细的输出(想要详细的信息加上去就行)。
- -q:快速打印输出
2.tcpdump 支持的表达式
- 否 : ! 或 not
- 与 : && 或 and
- 或 : || 或 or
- 多个条件可以使用括号包起来, 比如:
- $ tcpdump -i eth1 ‘(dst host 192.168.1.1 and port 80)’
3.协议 header 过滤规则:
- proto[x:y] : 从第 x 个位置开始取 y 字节, ip[2:2] 表示取 IP 首部中的第 3,4 字节(x 从 0 开始计算);
- proto[x:y] & z = 0 : proto[x:y] 的结果和 z 进行 与 运算, 匹配最终结果为 0的报文;
- 操作符包括: >, <, >=, <=, =, !=
- $ tcpdump -i ens33 ‘ip[0] > 69’ :过滤出IP协议4以上的报文
- $ # tcpdump -i ens33 ‘ip[0] & 15 > 5’ :功能同上
- $ # tcpdump -i ens33 ‘ip[0] & 0xf > 5’ :功能同上
4.测试IP数据报是否包含碎片信息
- tcpdump -i ens33 ‘ip[6] = 64’ # 没有碎片
- tcpdump -i ens33 ‘ip[6] = 32’ # 有碎片, 但不匹配最后的碎片
- tcpdump -i ens33 ‘((ip[6:2] > 0) and (not ip[6] = 64))’ # 匹配最后的碎片
- 可以用下面的命令检测:
- $ ping -M want -s 3000 192.168.1.1
- $ tcpdump -i ens33 ‘ip[2:2] > 600’
5.tcp 三次握手的过程中
- tcpdump -i ens33 ‘tcp[13] = 2’ :发端发送 SYN
- tcpdump -i ens33 ‘tcp[13] = 18’ :接收端回应 SYN, ACK
- tcpdump -i ens33 ‘tcp[13] & 2 = 2’ :发送端发送 ACK
- -s :从每个报文中截取snaplen字节的数据