1. 常见名词
1.1 IP地址
1、一个IP地址唯一标识一个网络接口;
2、IP地址分为IPv4(32位)和IPv6(128位);
3、IP地址分为公网IP地址和内网IP地址,公网IP地址可以直接访问,内网IP只能在内网中访问;
4、一个物理设备有多少网卡,就有几个IP地址;连接两个网络的设备是路由器或者交换机,它至少有两个IP地址,分别接入不同的网络,让不同网络之间连接起来。
5、同一网络中的设备,IP地址前段相同,即网络号相同,通过子网掩码过滤得到网络号:网络号=IP地址&子网掩码;每台设备都需要正确配置IP地址和子网掩码;
6、不同网络中的设备不能直接通信,需要通过路由器或者交换机这样的网络设备间接通信。把这种设备称为网关。
7、网关的作用是连接多个网络,把来自一个网络的数据包转发到另一个网络。这个过程叫路由。
1.2 域名
1、由于IP地址直接记忆困难,通常使用域名访问某个特定的服务。域名解析服务器DNS负责把域名翻译成对应的IP地址,客户端再根据IP地址访问服务器。
2、查看域名对应IP地址的命令: 先输入nslookup ,再输入对应的IP地址。
3、本机域名位localhost,其对应IP地址总是本机地址127.0.0.1.
2. 网络模型
计算机网络从底层传输到高层软件,需要合理设计网络分层模型,每一层相互独立,足够灵活,完全解耦;每一层负责处理自己的操作。
OSI七层模型与TCP/IP四层模型之间的对应关系
物理层:在设备之间传输比特流,规定了电平、速度和电缆针脚。
数据链路层:主要将从物理层接收的数据进行MAC地址(网卡地址)的封装与解封,这一层的数据称为帧,在数据链路层工作的设备是交换机。
网络层:提供逻辑地址,供路由器确定路径。
网络层:将相邻层的数据进行IP地址的解封和封装,在这一层工作的设备是路由器,这一层的数据被称为数据包、报文。
传输层:定义了一些传输数据的协议和端口,eg:TCP(传输控制协议,传输效率底,可靠性强),UDP(用户数据报协议,用于传输可靠性要求不高的数据),将下层数据进行分段传输,到达目的地址后再进行重组。这一层的数据叫做段。提供面向连接或非面向连接的数据传递以及进行重传前的差错检测。
会话层:通过传输层建立数据传输的通路,主要在系统之间发起会话或者接收会话请求,(设备之间需要互相认识,可以是IP地址,MAC地址或者主机名)
表示层:对接收的数据进行加解密,加解压缩。
应用层:终端应用,与用户交互,提供接口和服务。
2.1 物理层-------------数据通信的光电物理特性;
通过物理介质(空气,光纤,电缆等)连接不同物理设备,传输0/1比特流。例如主干ISP之间通过海底电缆连接。
2.2 数据链路层-------------管理相邻节点节点之间的数据通信;
2.2.1 封装成帧
数据链路层传输数据的基本单位为帧,发送端在一段数据前后添加特定控制字符形成帧;接收端根据标记识别出帧。帧的结构:
帧首部 | 帧的数据 | 帧尾部 |
---|
其中帧的数据表示的是IP数据报,如果帧首部和尾部是特定的控制字符(特定的比特流),而IP数据报中恰好有控制字符如何处理?–透明传输
2.2.2 透明传输
当IP数据报中恰好有帧的控制字符时,通过在IP数据报中的控制字符前加转义字符ESC解决。
2.2.3 差错监测
物理层只管传输比特流,无法控制是否出错,数据链路层负责起"差错监测"的工作,但不进行校正。常见的方法有:奇偶校验码,循环冗余校验码CRC。
2.2.4 最大传输单元MTU
数据链路层的数据帧的长度收到MTU限制,数据帧过长或者过短都会影响传输的效率,以太网MTU一般为1500字节。
2.2.5 以太网协议Ethernet
以太网协议是一种局域网技术,应用于数据链路层,使用以太网协议可以完成相邻设备的数据帧传输。以太网数据帧结构如下:
2.2.6 MAC地址表
MAC地址是物理地址,硬件地址;每一个设备都有唯一的MAC地址;MAC地址共48位,使用16进制表示(6字节);windows中通过命令ipconfig/all可以查看所有设备的物理地址。
- MAC地址表
MAC地址 | 硬件接口 |
---|---|
31-B4-9E-ED-85-43 | 接口1 |
32-B4-9E-DD-85-43 | 接口2 |
… | … |
- 交换机工作原理
交换机是根据MAC地址转发数据帧的,在交换机中有一张记录着各主机MAC地址与交换机接口对应关系的表,交换机根据MAC地址表将数据帧传输到指定主机上。
交换机接收到数据帧以后,先记录数据帧中源MAC地址和对应的接口到MAC表中,然后检查自己的MAC表中是否有数据帧中目标MAC地址信息,有则根据MAC地址表中记录的对应接口将数据帧发送出去(单播),无则将会将该数据帧从非接收接口广播出去。
如下,交换机传输数据帧详细过程为:
(1) 主机A将目标MAC地址为主机B的数据帧发送给交换机。
(2) 交换机接收到数据帧,先把数据帧中源MAC地址和对应的接口记录到MAC地址表中。
(3) 交换机检查自己的MAC地址表中是否有目标MAC地址信息,若有,从表中记录的接口发送出去(单播);若无,则从此数据帧非接收接口发送出去。(广播)
(4) 此时局域网中所有主机都会接收到此数据帧,但只有主机B收到此数据帧时会响应这个广播,并回应一个数据帧,此数据帧中包括主机B的MAC地址。
但对于跨设备传输,如下图,A如何把数据传输到C?
2.3 网络层-------------数据路由(决定数据在网站中的路径);
由于实际的计算机网络是错综复杂的,物理设备通过IP协议,屏蔽了物理网络之间的差异,当网络中的主机使用IP协议连接时,无需关注网络的细节。设备A和B之间通过虚拟互连网络相连,进行数据的传输。
2.3.1 IP协议
IP协议使得复杂的世纪网络变为一个虚拟互连的网络;使得网络层可以拼比底层细节而专注于网络层的数据转发。解决了在虚拟网络中数据报传输路径的问题。
-
IP地址: IPv4地址有32位,用点分十进制表示分为4段,最多有232个IP地址; IPv6地址有128位,用点分16进制表示,最多有2128个IP地址;
-
IP地址帧结构
网络层【IP数据报】:【IP首部】【IP数据报的数据】 【帧的数据】:即【IP数据报】 数据链路层【数据帧】:【帧首部】【帧的数据】【帧尾部】
![](https://i-blog.csdnimg.cn/blog_migrate/65e3470a6f08571344c14a87fe9d6ace.png)
- IP首部:
![](https://i-blog.csdnimg.cn/blog_migrate/235e5a964156e28e75a811d6d44de20a.jpeg)
版本:4位,指IP协议版本(IPv4和IPv6),通信双方版本必须一致;
首部长度:4位,表示IP首部长度。
总长度:16位,表示IP数据报总长度(IP首部+IP数据),最大值为65535,大于数据链路层MTU的最大值1500字节,因此IP数据报需要分片传输。
标志:标记IP报文是否可分片;
片偏移:若IP报文分片,标记为第几片;
生存时间(TTL):IP数据报文在网络中的寿命,每经过一个设备,TTL-1,TTL为0,网络设备丢弃该报文。防止IP报文在网络中找不到终点时,在网络中无线传输,占用带宽。
协议:表示IP数据报携带的具体数据是什么协议(eg,TCP,UDP,ICMP,OSPF等);
源地址:源IP地址 目的地址:目的IP地址
部分常用协议:
协议名 | ICMP | IGMP | IP | TCP | UDP | OSPF |
---|---|---|---|---|---|---|
字段值 | 1 | 2 | 4 | 6 | 17 | 89 |
- IP协议的转发流程–逐跳转发
2.3.2 ARP缓存表
ARP缓存表:每个主机都有一个ARP缓存表,缓存了IP地址与硬件接口之间的对应关系;是ARP协议和RAP协议运行的关键。ARP缓存表存有IP地址和MAC地址的映射关系–直接查询;ARP缓存表无IP地址和MAC地址的映射关系–广播回应。eg.
IP地址 | MAC地址 |
---|---|
192.168.53.234 | 00-50-56-e0-33-40 |
192.168.43.234 | 00-10-56-d0-23-40 |
192.168.42.234 | 00-40-46-e0-33-40 |
… | … |
ARP协议和RARP协议
- ARP协议:地址解析协议(Address Resolution Protocol),通过目标设备的IP地址,查询目标设备的MAC地址。
工作原理:
- 源主机发送数据时,先检查ARP列表中是否有目的IP地址的主机MAC地址,有则直接发送数据。没有就以广播的形式向本子网所有主机发送ARP数据包,数据包中包含:源主机IP地址,源主机MAC地址,目的主机的IP地址。
- 当本网段的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,忽略该数据包;如果是,将数据包中源IP地址和源MAC地址写入自己的ARP缓存表,然后将自己的IP地址和MAC地址写入响应,发送给源主机。
- 源主机接收到ARP响应包后,将目标主机的IP和MAC地址写入到ARP缓存表中。
- RARP协议:将MAC物理地址转换成IP地址。
ARP请求/响应的IP数据包和帧数据结构:
2.3.3 路由表
路由器负责不同网络之间的通信,路由器中有路由表,记录着不同网段的信息,路由表中的信息分为直连路由和非直连路由。
- 直连路由:直接连接在路由器接口的网段,由路由器自动生成。
- 非直连路由:不是直接连接在路由器接口上的网段,此记录需要手动添加或者使用动态路由。
- 路由表简介
路由表中的记录有的需要手动添加(静态路由),有的测试动态获取的(称为动态路由)。直连路由属于静态路由。
目的IP地址 | 下一跳IP地址 |
---|---|
IP1 | IP4 |
IP2 | IP5 |
IP3 | IP6 |
… | … |
2.路由器工作原理: 主机A给主机B发送消息。
-
主机A用本机配置的24位子网掩码与目标IP地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送给主机B的数据包需要经过路由器的转发。
-
主机A通过ARP请求获取路由器1的MAC地址,将数据包发送到路由器1。
-
路由器1接收到数据帧以后,检查自己的路由表是否有目标IP网段相匹配的项,根据路由表中记录的网段,将数据包发送给路由器2;
-
路由器2对数据帧中的目标IP进行检测,与路由表匹配,发现正好是直连接口,直接把数据帧发送到目标B;
2.3.4 IP地址的子网划分
IPv4地址长度为32位,使用点分十进制表示(0 ~ 255 . 0 ~ 255 . 0 ~ 255 . 0 ~ 255),一共有232个IP地址,直接管理232个IP地址非常麻烦,因此进行子网划分。
IP地址分类
IP地址=网络号+主机号,根据网络号的不同,不同子网所容纳的主机数不同
最小网络号 | 最大网络号 | 子网数量 | 最小主机号 | 最大主机号 | 主机数量 | |
---|---|---|---|---|---|---|
A类地址 | 0(00000000) | 127(01111111) | 27 | 0.0.0 | 255.255.255 | 224 |
B类地址 | 128.0 | 191.255 | 214 | 0.0 | 255.255 | 216 |
C类地址 | 192.0.0 | 223.255.255 | 221 | 0 | 255 | 28 |
上表包含特殊主机号和网络号。
- 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255 - 回环地址
127.0.0.1,不属于任何类别地址,仅代表设备本地虚拟接口,一般用于测试使用。
子网划分
如果某个公司有100台(100<254)计算机,公司可申请C类IP地址;若公司有256台计算机,则需要申请B类IP地址,这样就会造成较大的浪费,为了进一步利用IP地址,进一步进行子网划分。
- 子网掩码
A类地址默认掩码:255.0.0.0/8
B类地址默认掩码:255.255.0.0/16
C类地址默认掩码:255.255.255.0/24
子网掩码用来指明一个IP地址的哪些位标志的是主机所在的子网,根据IP地址和子网掩码求网络地址和广播地址,示例 :
一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,要求计算这个主机所在网络的网络地址和广播地址:
//根据子网掩码分割网络号和主机号,255.255.255.224对应:
11111111 11111111 11111111 11100000
//网络号有27位,主机号有5位
//网络地址:IP地址&子网掩码
11001010 01110000 00001110 10001001
11111111 11111111 11111111 11100000
-----------------------------------
11001010 01110000 00001110 10000000
//即:202.112.14.128
无分类编址CIDR
CIDR中没有A,B,C类网络概念,将网络前缀相同的IP地址称为一个CIDR地址块。网络前缀任意位数;IP地址 = 网络前缀 + 主机号
CIDR表示法给出任何一个IP地址,就相当于给出了一个CIDR地址块。eg:、
128.14.35.7/20 : 10000000 00001110 00100011 00000111
前20位是网络号,后12位是主机号,因此可以计算出这个CIDR地址块的最小地址和最大地址:
最小地址:10000000 00001110 00100000 00000000 = 128.14.32.0
最大地址:10000000 00001110 00101111 11111111 = 128.14.47.255
子网掩码:11111111 11111111 11110000 00000000 = 255.255.240.0
因此这个CIDR地址块有(47-32+1)*256 = 4096个地址,包含全0和全1。
CIDR子网划分:网络号向主机号借走2位时可以划分成4个子网;eg:
机构分配给某高校一个CIDR地址块:206.0.68.0/22,然后该高校根据内部不同系有不同人数的分配方案如下:
一系:206.0.68.0/23,一系内部又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网。
二系:206.0.70.0/24,二系内部又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网。
三系:206.0.71.0/25,三系内部又分为206.0.71.0/26和206.0.71.64/26两个子网。
四系:206.0.71.128/25,四系内部又分为206.0.71.128/26和206.0.71.192/26两个子网。
2.3.5 网络地址转换NAT技术
NATNetwork Address Translation,由于IP地址是有限的,为了进一步减缓IPv4地址的消耗,提出了NAT技术。nat技术将私网IP转换公网IP。
做如下操作:
在百度中查询本机的IP地址:111.47.18.43
使用命令ipconfig查询:192.168.6.1
这两种方式查到的ip地址不同,是为什么?
ipconfig查出来的是本机的IP地址,也就是内网私有地址,此类地址仅在局域网使用,不能联通外网。
百度查出来的地址是外网公有地址,用于连接互联网
什么是公有地址(public ip)和私有地址(private ip)?
公共 IP ,由 INTERNIC 所统一规划的 IP,全球公网唯一,有这种 IP 才可以连上 Internet ;
私有 IP 或保留 IP,不能直接连上 Internet 的 IP ,主要用于局域网络内的主机联机规划。
私有IP在子网划分得A,B,C类中各保留了一段作为私有IP网段,那就是:
A:10.0.0.0 - 10.255.255.255
B:172.16.0.0 - 172.31.255.255
C:192.168.0.0 - 192.168.255.255
公网ip是能够连接互联网的,私网IP 一般只用作局域网。
举例:学校机器的上网流程
-
移动公司分给我们学校分配的公网IP的是111.47.18.43,学校内所有机器都可以通过这个公网IP上网,如何实现呢?
-
划分局域网,我们学校采用的是C类地址的私有IP网段,192.168.0.0 - 192.168.255.255,我的私有IP是192.168.6.1,如何通过私有ip连上网呢?
-
通过私网IP把我的请求发送给路由器,然后由路由器来对接网络,再把数据发送给Internet,然后internet发送数据到我们学校的路由,然后路由再通过我的私网ip发送给我。
NAT的转换中,最关键的流程有以下几点 -
网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关
-
网络访问只能先由私网侧发起,公网无法主动访问私网主机;
-
NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
-
NAT网关的存在对通信双方是保持透明的;
-
NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
2.3.6 国际控制报文协议ICMP
新搭建好的网络需要进行测试来验证网络是否通畅,但是由于IP协议不提供可靠传输,如果丢包了,IP协议不能通知传输层是否丢包以及丢包的原因。
ICMP(Internet Control Message Protocol)协议可以确认IP包是否成功到达目标地址;通知在发送过程中IP包被丢弃的原因。
ICMP的报文格式
ICMP报文包含在IP数据报中。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/b5c177f8875b34440d1f8a2795f77df9.png)
ICMP大概分为两类报文:
一类是差错报告报文;一类是用于诊断查询
类型及含义如下:
ICMP协议的应用
- Ping应用–主要使用询问报文
可以使用Ping命令排查网络故障:
Ping回环地址127.0.0.1:若无返回,说明计算机协议栈出现问题,需要重装系统。
Ping网关地址(路由器地址):若无问题,内网是连通
Ping外网地址:内网和外网是否通。
- Traceroute应用
Traceroute可以探测IP数据报在网络中走过的路径。
TTL:8位,IP数据报在网络中的寿命,可进行设置,每经过1个设备,TTL-1,当TTL=0时,网络设备丢弃该报文。并发出一个ICMP终点不可达差错报文。
2.3.7 网络层路由算法
路由算法用来解决,数据报传输过程中:
下一跳地址怎么来的
下一跳地址唯一吗?
下一跳地址是最佳的吗?
路由器之间如何协同工作?
自治系统(AS)是一个处于管理机构下的网络设备群。AS内部路由协议为内部网关协议(RIP,OSPF),AS外部路由协议:外部网关协议(BGP)。
内部网关协议RIP
RIP(Routing Information Protocol )是一种比较简单的内部网关协议,主要用于规模较小的网络,比如校园网以及结构较简单的地区性网络。
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它通过UDP报文进行路由信息的交换,使用的端口号为520。具体过程:
(1) 路由器初始化路由信息(2个向量Di和Si,分解记录当前节点到相邻节点和到相邻节点的距离);
(2) 根据相邻路由器发来的信息,对路由表进行修改:
i 检索本地路由,将信息中新的路由插入到路由表中。
ii 检索本地路由,对比相同目的的距离,将距离较小的路径更新到路由表。
(3) 若经过16跳未收到相邻路由信息,则把相邻路由设置为不可达。
![](https://i-blog.csdnimg.cn/blog_migrate/de5953d97bb26d483cabd560b4a9b3fd.png)
内部网关协议OSPF
OSPF(open shortest path first)属于链路状态路由协议,核心是Dijkstra算法,解决了RIP过程为:
(1) 向所有路由器发送消息,广播出去;
(2) 消息描述该路由器与相邻路由器的链路状态(l距离、时延、带宽等);
(3)只有链路状态发生改变时,才发送更新消息。
解决了RIP协议随意相信相邻路由器,和只和相邻路由器通信的缺点。
外部网关协议BGP
找到一条到达目的地比较好的路由。
2.3 传输层-------------管理端到端的通信连接;
网络层提供了虚拟互连的网络,不同设备炼乳虚拟互连网络可进行通信,网络层解决了虚拟互连网络中的路由,传输层只关心终端设备之间如何进行通信:eg:浏览器与网站后台的通信====进程与进程的通信。
2.3.1 进程间通信方法
- 单机中进程通信:Unix域套接字、共享内存
- 不同机器间进程通信:网络通信
- 端口Port:使用端口标记不同的网络进程,端口使用16bit (0~65535) 表示。
2.3.2 UDP协议
UDP(User Datagram Protocol)协议:用户数据报协议,由于UDP是不可靠传输协议,如果将数据报分片传输,分片丢失导致重组失败,将导致UDP数据包被丢弃,因此UDP协议不合并或者拆分应用层的数据,直接把数据封装传输,应用层数据报越长,UDP报文越长。但受到底层限制,由于以太网数据帧最大长度是1500字节。在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。分析如下:
在链路层,数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500;
在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
所以,在应用层,Data最大长度为1472。
UDP 报文格式(由UDP头部和UDP数据组成)
如图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/c66f692c67c7b09617996c3d0cd3808a.png)
源端口: 16 位,表示源机器正在使用该端口的进程;
目的端口:16位,表示目的机器正在使用该端口的进程;
长度:16 位,表示 UDP 数据报长度,最小为 8字节。
校验值:16 位,检验UDP数据报在传输过程中是否出错。
UDP协议特点:
1. UDP是无连接协议(随时可发送数据,不关心是否建立连接)
2. 不能保证可靠传输(想发就发,无法保证数据在网络中是否丢失)
3. 面向报文传输的:不对报文做任何处理,直接封装应用层数据进行传输。
4. 没有拥塞控制:不管网络是否拥塞,都将数据交付出去。
5. UDP的首部开销很小:共8字节
2.3.3 TCP协议
TCP协议:传输控制协议
TCP数据是封装在一个IP数据中。
![](https://i-blog.csdnimg.cn/blog_migrate/67fb8d6eccb45afae0eb2641ad61821b.gif)
TCP协议特点:
1. TCP是面向连接的协议
2. TCP的点对点通信
3. TCP提供可靠的传输服务
4. TCP提供全双工的通信
5. TCP是面向字节流的协议,和UDP不同,不将应用层数据报看作是一整块,有合并和拆分。
TCP头部:
![](https://i-blog.csdnimg.cn/blog_migrate/322823a09260052aeb9a067607cad843.png)
源端口:表示源机器中正在使用该端口的进程
目的端口:表示目的机器中正在使用该端口的进程
序号:数据的首字节序号,TCP是面向字节流传输的
确认号:期望收到对方的下一个报文的首字节序号,前面的已经接收。
数据偏移:TCP报文的数据起点距离TCP报文起点的距离,其实标记了TCP头部长度。
保留:为今后使用,目前置为0;
窗口:允许对方发送的数据量。
校验和:校验数据传输是否出错;
紧急指针:指定紧急数据报(URG=1)在报文中的位置;
选项:支持未来拓展
TCP标记:
确认位ACK(Acknowledgment)--ACK=1时确认号才有效,建立TCP连接后,所有传送的报文都必须置ACK=1;
推送位PSH(push)--当两个进程交互式通信时,一段应用进程希望键入一个命令后立即就能收到对方的响应。接收方收到PSH=1的TCP报文段,就尽快地交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
复位位RST(reset)--RST=1时,表示TCP连接出现严重错误,必须释放连接,然后重新建立连接。
同步位SYN(synchronization)--建立连接时用来同步序号。SYN=1而ACK=0,表名这是一个请求报文,对方若同意建立连接,则在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个请求报文或者连接接受报文。
终止位FIN(finished)用来释放一个连接。当FIN=1,表示发送数据完毕,要求释放连接。
可靠传输原理:
无差错传输:
超时重传3种情况:
-
(1)发送的消息在传输过程中丢失
-
(2)确认的消息丢失
-
(3)确认的消息很久才到
停止等待协议:发送方发送1个消息后,停止生成新消息,等待接收方的确认信息到达后,再生成新消息,超时就重传。接收方同理,因此每发送一个消息都需要设置一个定时器。
连续ARQ协议(Automatic Repeat Request,自动重传请求):由于单个字节发送和确认效率很低,因此批量发送和确认,采用滑动窗口累积确认。超时则重传。
连续 ARQ 协议的工作原理图:
假设发送9个字节,滑动窗口为6,当1,2字节确认后,窗口向前移2位。
由于确认每个字节的开销大,因此对滑动窗口中的字节采用累积确认。
TCP的可靠传输
TCP协议可靠传输基于连续ARQ协议,TCP的滑动串口以字节为单位。
有如下几种情况:
(1)当23,24,25,26已发送未确认,可用窗口长度为3,由于已发送的字节为收到确认,串口不能向前移动。经过一段时间后,23,24字节被确认后,窗口向前移动2;此时25,26已发送未确认,可用窗口长度为5;
(2)当23-29均已发送未确认,可用窗口为0,滑动窗口不能往前移动;
(3)当25,27收到确认,而23,24,26,28,29未收到确认,窗口不能往前移动,当超时时间已到,23,24还未确认,从23开始,窗口内的数据全部重传。
以上这种方式下,25,27已经确认,可能还需要重传,效率比较低,因此可以采用选择重传。
- 选择重传:需要指定重传的字节,每一个字节都有唯一的32位序号,将选择重传的序号存储在TCP选项中(最多40字节),则TCP选项最多存储10个序号;(存储需要重传的序号的边界序号)。
TCP流量控制–TCP特有
流量控制是让发送方发送速率不要太快(接收方可能不能太快接收处理流量),流量控制通过滑动窗口来实现。窗口指明允许发送方发送的数据量。
接收方在每一次应答时,告诉发送方可接收数据的窗口大小,发送方根据窗口大小调整发送的数据长度,接收方通过控制窗口大小实现控制发送方的发送速率。
当接收方处理完消息后,通知发送方窗口增大;若此时增大窗口的报文为到达发送方,发送方和接收方都进行等待;这时就需要启动坚持定时器,当接收到窗口为0,则启动坚持定时器;坚持定时器每隔一段时间发送一个窗口探测报文。
TCP的拥塞控制
一条数据链路经过很多设备,每个部分都可能成为网络传输瓶颈。流量控制和拥塞控制的区别:
- 流量控制:考虑点到点的通信量控制;
- 拥塞控制:考虑整个网络,报文超时则认为是拥塞。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
TCP的四种拥塞控制算法
1.慢开始
2.拥塞控制
3.快重传
4.快恢复
- 慢启动算法:由小到大逐渐增加发送数据量,每收到一个报文确认,窗口就增大一番;增大到阈值,启动拥塞避免算法。
- 拥塞避免算法:维护一个窗口变量,只要网络不拥塞,就试探着调大拥塞窗口,只要报文不超时。
TCP三次握手–建立TCP连接
第一次握手:Client将标志位SYN置为1,随机产生一个序列号seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序列号ack=J+1,随机产生一个序列号seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
-
建立TCP连接为什么不采用二次握手(为什么要3次握手)?
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。如果采用二次握手,当第一次握手的报文超时时,会进行重传,第一次超时的报文到达接收端后会被接收端确认并进行第二次握手建立连接,同样超时重传的第一次握手的报文也会被接收端确认并进行第二次握手建立连接。
但是采用3次握手的方式,超时的报文的第三次确认,发送方不会进行握手,则不会建立连接;而重传的报文会进行第三次确认建立连接。
TCP四次挥手–释放TCP连接
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN=1来终止这一方向的连接,收到一个FIN=1只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到另一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
1. 第一次挥手:Client发送一个FIN=1,sep=u(u是前面已经传送过来的数据的最后一个字节的序号+1),用来关闭Client到Server的数据传送,Client停止发送数据,进入FIN_WAIT_1状态。
2. 第二次挥手:Server收到FIN=1后,发送一个ACK=1给Client,确认序号ack=u+1为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3. 第三次挥手:Server将数据发送完毕后,向客户端发送释放连接报文,发送一个FIN=1,用来关闭Server到Client的数据传送,Server进入LAST_ACK最后确认状态。
4. 第四次挥手:Client收到FIN=1后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
15.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
原因有二:
一、保证TCP协议的全双工连接能够可靠关闭
二、保证这次连接的重复数据段从网络中消失
先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
-
套接字Socket
使用端口(port)来标记不同的网络进程 {IP:Port}表示套接字,指定网络中某设备正在使用网络的进程。 套接字是抽象概念,表示TCP连接的一端 通过套接字可以进行数据发送或接收。 TCP连接由两个套接字组成:TCP={Socket1:Socket2} 分分为网络套接字(网络传输)和域套接字(单机)
2.4 会话层-------------管理(建立,维护,重连)通信会话;
2.5 表示层-------------数据处理(编码,解码);
2.6 应用层-------------为计算机用户提供接口和服务;
-
传输层及以下的层提供完整得通信服务,应用层面向用户的一层。
-
应用层得作用:定义应用间通信得规则
-
DNS:域名系统–把无规则得IP地址转换成容易理解得域名。DNS解析–DNS服务器
-
DHCP协议:动态主机设置协议,自动从网络中获取IP地址。终端设备在不同地方不需要配置IP地址。
DHCP过程:DHCP服务器监听默认端口67; 主机使用UDP协议广播DHCP发现报文; DHCP服务器发出DHCP提供报文; 主机向DHCP服务器发出DHCP请求报文; DHCP服务器回应并提供IP地址;
-
Http协议–超文本传输协议(用于C/S架构),基于TCP/IP协议之上的应用层协议
http(s)://<主机>:<端口>/<路径> 主机--可为IP,可为域名 端口:80--http,443--安全的http
-
HTTP客户端发起一个请求,创建一个到服务器指定端口(默认80端口)的TCP连接;HTTP服务器在80端口监听客户端请求。一旦收到请求,服务器会向客户端返回一个状态,比如“HTTP/1.1 200 OK”,以及返回的内容,如请求的文件,错误信息或其他信息。
-
HTTP工作原理:HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
(1)客户端请求报文方法 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。 GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。 POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。 DELETE:删除指定得服务端资源。 UPDATE:更新指定得服务端资源。 (2)指定资源的方法 在地址中指定:eg:http://coding.imooc.com/class/335.html; http://coding.imooc.com/?sort=0&unlearning=0&page=2 在请求数据中指定:POST http://coding.imooc.com HTTP/1-1 Accept-Encoding:gzip Accept-Language:zh-CN { "sort":0, "unlearning":0, "page":2 }
-
HTTP请求/响应步骤:
1. 客户端连接Web服务器 一个HTTP客户端,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如:http://www.luffycity.com 2. 发送HTTP请求 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行,请求头部,空行和请求数据4部分组成。 3. 服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行,响应头部,空行和响应数据4部分组成。 4. 释放连接TCP请求 若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接受请求。 5. 客户端浏览器解析HTML内容 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
-
在浏览器地址栏键入URL,回车后经历一下流程:
1. 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址; 2. 解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接; 3. 浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器端; 4. 服务器对浏览器请求做出响应,并把对应的html文本发送给浏览器。 5. 释放TCP连接; 6. 浏览器解析该html文本并显示内容。
-
HTTP协议是基于TCP/IP协议之上的应用层协议;基于请求-响应模式;HTTP协议自身不保存请求和响应之间的通信状态,每当有新的请求发送,就会有对应的新响应产生。
-
无状态保存遇到的问题:随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。
eg.用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。 针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。 HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
-
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。无连接有两种方式,早期HTTP协议是一次请求一次响应后,直接断开连接;HTTP协议1.1后,一次请求一次响应后,等待几秒,若有新请求,通过原连接通信,否则断开连接。
-
HTTP请求方法
HTTP/1.1协议中共定义了8种方法,以不同的方式操作指定的资源
(1)GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应该被用于产生“副作用”的操作中,eg.在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。 (2)HEAD 与GET方法一样,向服务器发出指定资源请求。不过服务器不传回资源的文本部分,可以获取关于该资源的元数据。 (3)POST 向指定资源提交数据,请求服务器进行处理。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源。 (4)PUT 向指定资源位置上传其最新内容。 (3)DELETE 请求服务器删除Request-URI所标识的资源。 (4)OPTIONS 使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。 (3)TRACE 回显服务器收到的请求,主要用于测试或诊断。 (4)CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
GET和POST区别:
(1)GET提交的数据会放在URL之后,也就是请求行里,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test&id=123456.(请求头里content-type的参数形式),POST方法是把提交的数据放在HTTP包的请求数据中。
(2)GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
(3)GET和POST请求在服务端获取请求数据方式不同。根据服务端自定义方法。注意事项:
(1)方法名称区分大小写。当请求所针对的资源不支持对应的请求方法的时候,服务器返回状态码405;当服务器不认识或不支持对应的请求方法时,返回状态码501; (2)HTTP服务器至少实现GET和HEAD方法,其他方法可选。
-
HTTP状态码
所有HTTP响应的第一行就是状态行,【HTTP版本号】【状态码】【状态描述】状态码第一个数字代表响应类型:
-
URL
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的5个基本元素包括在一个简单的地址中:
(1)传送协议 (2)层级URL标记符号(为[//],固定不变) (3)访问资源需要的凭证信息(可省略) (4)服务器。(通常为域名,有时为IP地址) (5)端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略) (6)路径。(以“/”字符区别路径中的每一个目录名称) (7)查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题) (8)片段。以“#”字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:
(1)http:传送协议; (2)//:层级URL标记符号; (3)www.luffycity.com:域名,即服务器域名; (4)80:服务器上的默认网络端口号,默认不显示。 (5)/news/index.html:路径。(URI:直接定位到对应资源); (6)?id=250&page=1:查询;
-
HTTP请求格式(请求协议)
URL中包含路径和参数,请求报文格式如下;
请求头里面的内容举个例子:这个length表示请求体里面的数据长度,其他的请求头里面的这些键值对,大概知道一下就可以了,其中有一个user-agent,需要记住,就是告诉服务端,我是用什么给你发送的请求。
-
HTTP响应格式(响应协议)
响应报文格式如下;