计算机网络是通用,可编程的硬件组成的,并且这些设备可互连,并且可以传输不同类型的数据

计算机网络不是只有软件概念,还有硬件设备,例如:网卡,网线,路由器等等

网络作用范围:广域网(WAN),城域网(MAN),局域网(LAN)

计算机网络发展历史

ARPANET(1969年,美国国防部创建的单个网络)

三层结构互联网(现代互联网雏形,当时主要用于连接美国学校,实验室的计算机,主干网,地区网,校园网)

多层次ISP互联网(ISP指网络服务提供商(Internet Service Provider),常见网络服务提供商有中国移动,中国电信,中国联通等等)

多层次ISP互联网,分主干ISP(主要跨国通信),地区ISP(主要局部地区通信,例如广东移动,北京电信等等)

中国创建了多个公共互联网,例如:中国电信互联网(CHINANET),中国移动互联网(CMNET),中国联通互联网(UNINET),中国教育与科研计算机网(CERNET),中国科学技术网(CSTNET)等等

计算机网络层次结构(确保数据通信顺通,识别目标计算机的状态,数据是否存在错误)

层次结构大概分3个,网络应用,数据通信,物理网络

层次细分的话,有七层,也就是OSI七层模型(OSI国际标准定义的),而且每个层都是独立的(不干预其他层),只完成不同的工作

OSI七层模型:应用层(为计算机提供服务),表示层(数据处理),会话层(管理通信会话),传输层(管理通信连接),网络层(数据路由),数据链路层(管理节点之间的数据通信,例如传输数据到另一个局域网),物理层(计算机物理设备)

OSI七层模型并没有成为广泛使用的标准,而是采用TCP/IP四层模型

TCP/IP四层模型:应用层(对于OSI七层模型的应用,表示,会话,HTTP协议),传输层(OSI七层模型的传输层,TCP/UDP协议),(OSI七层模型的网络层,IP/ICMP协议)网络层,(数据链路层和物理层,ARP/RARP协议)网络接口层



计算机网络性能指标

bps=bit/s,1秒多少比特位,比特率

时延:发送时延(数据bit除以bps),排队时延(数据等待被网络设备处理的时间),处理时延(数据到达目标机器后处理需要的时间),传输时延(传输路径除以bps)

总时延 = 发送时延+排队时延+传输时延+处理时延

往返时间RTT(Route-Trip Time):数据报文在通信中来回一次的时间(可通过ping命令来查看RTT)


物理层(连接不同的物理设备,传输比特流)

物理层传输介质:双绞线(又分屏蔽和无屏蔽,区别就是增加了一层屏蔽层),同轴电缆,光纤(通过光传输,光纤内部是具有高折射率的纤芯,能折射光)

电缆使用铜作为传输介质,光纤通过光来作为传输介质

铜线中的电信号传播速度大约为2.3*10^8m/s

光纤中光信号的传播速度是2.0*10^8m/s

因此实质上电缆的传播速度比光纤快,因为光纤是利用光的反射来传输到远方的,实质光走的距离更长

但是电缆的铜在远距离的情况下,会导致衰减(主要有2个原因导致,介质损耗(通过电磁波传导,会在介质中产生电场的电荷规则排序,这会消耗能量)和导线损耗),需要通过中继器来延续信号

因此在跨市,跨城,跨省,跨国使用都是光纤(光纤的带宽比电缆好,也是一个原因),但是短距离,得益于电缆的传播速度,会更好,因此局域网内部大多使用电缆来传输(因为解析光信号,还需要个光信号调制调解器,计算机无法直接使用光纤传输的数据)

比特流:通过高低电平来表示比特流,来传输数据

信道(往一个方向传输信息的媒体,一个通信电路最少要有一个发送信道和接收信道)

信道的分类:单工通信信道(只能往一个方向通信的信道,没有反馈的信道,例如电视机的电视闭路线),半双工通信信道(可以发送和接收信息,但是不能同时发送,同时接收),全双工通信信道(可以同时发送,同时接收)

物理层会实现信道分用复用技术(提升信道的利用率)

频分复用,时分复用,波分复用,码分复用


数据链路层(封装成帧,透明传输,差错监测)

数据帧:数据链路层中数据的基本单位,数据发送方会在网络层的一段数据的前后添加特定标记,而这一段数据就是数据帧,数据接收方根据特定标记来识别数据帧,是数据链路层内部数据处理成帧

数据帧也分MAC帧(没有帧尾,因为MAC帧之间是96比特时间,帧头也是没有的,而是让物理层给MAC帧添加8bts的前导码),PPP帧(有帧头和帧尾,帧头到帧尾就是这个帧的长度)

封装成帧:数据链路层会将网络层交付的数据报文添加帧头和帧尾,让其成为帧

帧头和帧尾都是特定的控制字符(比特流),帧头(SOH):00000001,帧尾(EOT):00000100

透明传输:数据链路层对网络层提供的数据没有限制(控制字符在帧数据中,但是不会去当成数据去处理,就好像帧头和帧尾不存在一样)

字节填充(对数据内部的数据填充ESC转义字符),比特填充(零比特填充法:在每5个连续的1后面插入比特0)

数据链路层规定了帧的数据的长度限制,就是最大传输单元MTU(Maximun Transfer Unit)

以太网的MTU(MAC帧)是1500字节

路径MTU:由链路中MTU的最小值决定

差错监测:因为物理层只负责传输比特流,没有控制出错的功能,因此数据链路层提供了差错监测的功能

奇偶校验码:在发送的每个字节后加上一位,让字节中为1的数可以是奇数或者偶数,通过奇偶校验来确定数据是否出错,具体可以看https://zhizheng123.test.com/archives/77.html这篇文章,讲TCP的可靠性那里

奇偶校验码的缺点就是如果发生2位的出错,就无法校验出来错误

循环冗余校验码CRC(根据传输或者保存的数据来产生固定位数的校验码,校验码再附加到数据的后面)

模二除法:通过异或来表示0或者1,例如00就是0,01就是1,异为1,或为0

选择用于校验的多项式,并且在数据后面添加多个0,添加多个0的数据,通过模二除法来除以校验的多项式的位串,得到的余数将填充到原来数据的添加多个0的位置,来得到可校验的位串

假设校验的多项式为X3+X2+1,那么就是原数据后面添加3个0(添加多少个0取决多项式的最高阶,二进制位的最高位也取决于最高阶(最高幂次)二进制位数等于最高阶+1,这里就是表示的二进制位为4位的二进制数),二进制位串位计算就是1x3+1x2+0x1+1x0,就是1101

例如原数据为1010110,CRC校验码计算就是1010110000除以1101,得到的余数0001就是CRC校验码,在将原来填充0的位置填充CRC,就是10101100001,这个比特流就是要传输的数据

接收数据进行校验通过,传输的数据除以位串,来得到余数,根据余数来进行判断校验(余数为0则表示数据正确)

数据链路层只检测数据的错误,不会进行数据的纠错,数据错了,数据链路层将会丢弃错误的数据或者重新传输数据

MAC地址(物理地址,硬件地址,每个设备都有唯一的MAC地址,用48个比特位来表示,使用16进制)

MAC地址表:映射MAC地址到硬件接口上

以太网协议是数据链路层的协议,以太网协议是局域网技术,以太网协议用于完成相邻设备的数据帧传输


网络层(数据路由,数据在网络传输的路径,跨局域网,跨节点)

路由器的顶层是网络层,没有使用到传输层和应用层

网络层的ip协议,子网划分

虚拟互连网络(物理网络复杂,使用IP协议时,将无需关心物理网络的差异)

网络层利用IP协议来将使用IP协议的计算机连接起来,就好像这些计算机只需要连接一个虚拟互连网络一样,无需关心底层经过了哪些网关,路由器,ISP等等,将专注于数据的转发工作

IP协议

IP地址(v4只有32位,v6有128位),ipv4使用点分十进制表示,使用4组从0到255的数字表示ip地址,ipv6使用冒分十六进制,用8组4位的16进制表示ipv6地址

IP协议处理数据是数据链路层处理完毕的数据帧的数据,又叫IP数据报,IP数据报包含了目标的IP地址,源IP地址,IP数据,协议数据等等

IP数据报的4位版本,就是IP协议的版本,使用4位二进制表示,通信双方必须一致(否则无法通信),例如版本4(v4),版本6(v6)

IP数据报的4位首部长度,是表示IP首部的长度,使用4bit表示,4位填满就是1111,就是15bit,IP数据报限制每行是4个字节(32位bits),154就是60字节,因此首部最大可以是60个字节,IP数据报最短部分有5行,54,就是20字节,20字节是IP首部长度最小的值,这个看起来可能有点乱,下面解一下为啥是这样

首部长度的单位是32bit(4字节),也就是说首部长度0001是表示IP首部有32bit,4个字节,首部长度1111就是4*15(15是二进制1111换算出来的),就是IP首部最大是60个字节

因为IP数据报最少要有5行,这5行就是最小首部(第六行是可选的),每行4个字节,4*5就是20个字节,IP首部长度最小表示得是20个字节,用4位首部长度表示就是0101(就是5,因为1就表示了4个字节)

IP数据包的总长度是用16位bit表示,因此最大值为65535(2的16次方),这个总长度表示IP首部+IP数据的总长度,因此一个IP数据包最大是65535字节

当IP数据包大于MTU时,数据链路层会将IP数据包分片,以确保符合MTU

IP首部还有个服务类型,用8位表示,前面3位表示优先级,后4位是标志,最后一位是保留位,前面3位,满载就是111,也就是说有7种优先级,这个优先级没有强制性,物理设备也不看

IP首部标识,占16位,是计数器,相同数据包的标识是相同的(每生产一个数据包就+1),用来数据包的分段,以确保IP数据包能通过MTU限制的数据链路,最后为了数据帧拼装成完整的IP数据包,通过标识来确定,这个标识会被复制到数据帧的标识字段中,相同标识就表示是相同的IP数据包,就可以拼装成完整的数据包了

IP首部标志,占3位,只有2位有意义,表示该IP数据包是否分片,第一位没有使用,第二位表示DF(Don’t Fragment),是否要进行分帧(DF=0时才允许分片),第三位表示MF(More Fragment),是否后面数据报(MF=0时表示该数据包后面没有了,是最后的包),因此一个允许被分片,并且不是最后一个数据包时,标志表示为001,不允许分帧的话,超过MTU限制的数据包将被丢弃,并且向数据包的源头提示信息

IP首部片偏移,占13位,表示分片后,该片在原来ip数据包中的相对位置,片偏移是用8个字节为一个偏移单位,因此每个片的长度一定是8字节的倍数

生存时间TTL,占8位,表示该数据报文在网络中的寿命,经过一个设备TTL会减1,当TTL为0时,该数据报文将被设备丢弃,确保数据报不会一直在互联网的设备中传输,而消耗网络资源

协议,占8位,表示数据报携带的数据是什么协议的,让网络层知道应该将这个数据给哪个来进行处理,常见的协议取值,1为ICMP,2为IGMP,4为IP,6为TCP,17为UDP

首部检验和,占16位,用来校验数据报的首部,每经过一个设备,都会重新计算首部检验和,确保首部不出错,出错会被设备丢弃

IP源地址,占32位,表示发送该IP数据报的机器的IP地址

IP目标地址,占32位,表示该IP数据报需要到达的目标机器的IP地址

IP协议转发过程(逐跳(hop-by-hop))

MAC地址表工作过程:网卡发送数据帧,数据帧抵达路由器,路由器会取前6字节,来匹配MAC地址表,查找该MAC地址对于的网络接口,路由器就可以通过网络接口来对外发送数据帧

IP路由表和MAC地址表工作过程类似,IP路由表有目标IP地址,以及有要到达该目标IP地址的下一个地址,发出IP数据报,通过查询IP路由表得知,需要将改数据报发送给另一个IP,才能到达就会发送给另一个IP,另一个IP的设备查询路由表,需要给另一个IP,就发送给它,一直到抵达目的地,或者TTL死亡,计算机和路由器都有路由表

IP路由表是网络设备根据路由协议生成的,windows操作系统可通过route print命令查看本计算机的路由表

可以看到有5个属性,分别是网络目标(目标的IP)和网络掩码(表示IP地址的哪个标识是当前设备所在的子网),网关(将数据发送给哪个设备,网关又叫下一跳服务器),接口(发送数据包的网络接口,和当前网关是同一个子网)以及跃点数(到达目标需要经过的跃点数量,一个跃点就是一个路由器,TCP/IP协议会选择最低跃点数的路由)

网络掩码,又叫子网掩码,和IP地址搭配使用,子网掩码也是32位地址,用来屏蔽IP地址的一部分来区别是网络地址和主机地址,RFC950定义,表示网络地址的位都为1,表示主机地址的位都为0,例如192.168.1.2的子网掩码255.255.255.0,表示192.168.1是网络地址,最后的2才是主机地址,因此得到192.168.1.2是属于192.168.1.0这个网络下的,其中主机号为2

逐跳的过程:网络层通过路由表,知道下一个发送哪个设备来转发数据,网络层将封装IP数据报给数据链路层,并且告知目标的MAC地址是什么,数据链路层将数据帧发送给目标MAC地址,当接收数据帧后,会将数据帧给网络层(这也是为啥路由器最高层是网络层的原因,路由器不需要那么高层的功能),网络层查询路由表,得知下一个目标设备,并且将数据报给数据链路层,告知目标的MAC地址是什么,数据链路层会将数据帧发送给目标设备一直到真正的目标设备为止

数据帧在每一逐跳中,都会对MAC地址发送改变,但是IP数据报的IP地址不会发生变化

ARP协议(Address Resolution Protocol,地址解析协议)和RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)

ARP协议会将网络层的IP32位地址解析成数据链路层的MAC48位地址,ARP缓存表表示IP地址和MAC地址的映射关系,缓存表没有缓存时,ARP会广播,其他设备会回应,ARP将记录设备的IP和MAC地址,ARP缓存表的记录具有期限性

windows操作系统可通过arp -a命令查看本机的ARP缓存表

ARP协议报文是直接对数据链路层的数据帧进行封装的

ARP协议报文由2位的类型,28位的ARP请求应答,18位的PAD填充数据组成

其中28位的ARP请求应答报文,是由2位硬件类型,2位协议类型,4位标记,6位发送方的以太网地址,4位发送方的IP地址,6位的目标以太网地址,4位的目标IP地址组成

RARP的工作和ARP是逆操作,RARP协议是将数据链路层的MAC地址解析成IP地址,利用的也是ARP缓存表,RARP报文和ARP报文是一样的类型组成的

IP地址的子网划分

IP地址分类,将32位分成网络号,主机号

A类地址:8位网络号(前一位为0),24位主机号,最小网络号为0,最大网络号为127(01111111),最小主机号为0.0.0,最大主机号为255.255.255

B类地址:16位网络号(前二位为10),16位主机号,最小网络号为128.0,最大网络号为191.255,最小主机号为0.0,最大主机号为255.255

C类地址:24位网络号(前三位为110),8位主机号,最小网络号为192.0.0,最大网络号为223.225.255,最小主机号为0,最大主机号为255

特殊的主机号,主机号为0表示当前网段,主机号为1表示是广播地址,对当前网段的全部设备发送消息用的

特殊的网络号,A类地址中网络号全为0为特殊网络,例如0.0.0.0,A类地址中网络字段后7位为1是表示回环地址,例如127.0.0.1

B类地址网络号后14位都为0,例如128.0.0.1,C类网络号后21位为0,例如192.0.0.1

上面特殊的都是不可使用或者无法分配的

区别IP地址属于那一类地址,只需要将IP地址的前8位取出来,通过判断前1位到3位来知道,也是可以看前一段IP地址,例如192.168.1.1,这个明显超过A类,B类地址的最大网络号,因此是C类地址

127.0.0.1本地回环地址(Loopback Address),这个地址不属于任何一个地址类,它表示设备的本地虚拟接口,甚至无网卡也可以ping通该地址

还有D类地址,开头前4位是1110,E类地址前4位为1111,D类和E类地址用来特殊用途的,例如广播(D类),D类和E类是不区分网络地址和主机地址的

子网划分就是在网络号主机号的基础上添加子网号,通过子网掩码来匹配网络号

A类地址的子网掩码是255.0.0.0

B类地址的子网掩码是255.255.0.0

C类地址的子网掩码是255.255.255.0

子网掩码的二进制与IP地址的二进制进行与运算(位相同,并且为1返回1,位不相同,而且为0返回0),得到的运算结果转换为点分10进制,就是该IP属于这个IP的子网

无分类编址CIDR(Classless Inter-Domain Routing,无类域间路由选择,没有ABC这些网络分类,也没有子网划分)

CIDR将IP区分为网络前缀和主机号,网络前缀相同就表示是一个CIDR地址块,网络前缀不受限制

斜线记法,例如192.168.1.2/25,表示前25位为网络前缀,后7位为主机号(2的7次方,就是128,去掉最大和最小的,还有126个ip地址可以分配,而不需要像C类地址一样,直接就分配255-2个地址,造成地址浪费)

通过斜线记法占据网络前缀,主机号将可以灵活的占用,更有效分配IP地址,减少IP地址分配的浪费

CIDR的IP地址与子网掩码,进行与运算,可以得到网络号

网络地址转换NAT技术(解决IPv4地址不够用)

NAT技术将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

网关以及ISP,服务器使用外网地址,内部局域网使用内网地址

NAT(Network Address Translation,网络地址转换):让多个内网设备通过一个公网地址来访问互联网的技术,通过转发端口号来实现,内部的端口号,需要访问外网时,会分配一个新的端口号和新的地址(公网)来表示这个内网端口服务,这样外网访问这个公网的端口时,将可以映射给具体内网的端口服务

例如常见的NAT穿透技术(就是内网穿透)

ICMP协议(Internet Control Message Protocol,网际控制报文协议)

ICMP协议可以报告错误信息和异常信息,搭配IP协议使用

ICMP协议报文封转在IP数据报的数据中,ICMP协议报文由ICMP报文首部和ICMP报文数据组成

ICMP报文首部由8位类型(ICMP报文的类型,有2类,分别是差错报告报文,询问报文),8位代码(ICMP报文具体有哪些错误),16位的校验和组成

差错报告报文的常见类型有3(终点不可达,代码0为网络不可达,1为主机不可达),5(重定向,代码0为网络重定向,1为主机重定向),11(传输超时),12(缺少IP必要参数(1)或者IP头部问题(0))

询问报文的常见类型有0或者8(回送请求或者应答),13或者14(时间戳请求或者应答),询问报文主要查询网络是否互通,

使用了ICMP协议的应用有ping(询问报文),traceroute(发送IP数据包到目标需要走哪些路由)

windows可使用tracert命令来体验traceroute的功能,tracert baidu.com


传输层(给上层应用层提供通信功能,是数据通信的最高层,传输层实现进程与进程间的通信(跨设备,跨设备))

传输层协议:TCP协议和UDP协议

使用不同的端口表示不同的网络进程,端口使用16位表示,(0到65535),端口只对本地有意义,进行网络传输,还需要搭配IP来使用

传输层对上层应用层起到屏蔽底层的细节的作用,网络层传输点到点的传输,传输层就将点精确到端,进程的传输

UDP协议(User Datagram Protocol,用户数据报协议)

应用层传递的数据报,UDP不会对其进行合并,拆分,UDP协议数据报大小取决于上层网络层的数据报

UDP数据报分为UDP首部,UDP数据报数据(UDP数据报数据就是上层应用层提交的数据)

UDP首部由16位源端口号(源机器的端口),16位目标端口号(目标机器的端口),16位UDP长度(表示UDP数据报的长度),16位UDP校验和组成,UDP首部是8字节的长度

UDP无连接(不需要建立连接,直接对目标发送数据报),不保证可靠传输数据(不会感知数据报的发送失败,丢失),面向报文传输(应用层交付的数据报文有多大,UDP就传输多大的UDP协议报文,一次发送一个报文),没有拥塞控制(无法感知网络的拥塞情况,直接交付数据报给网络就完事)

TCP协议(Transmission Control Protocol,传输控制协议)

TCP协议报文也是在IP数据报的数据内部的,由TCP首部和TCP数据报数据组成

TCP是面向连接(需要提前建立连接,才能通信),提供可靠传输(连接管理(3次握手,4次挥手),数据分段(),校验和(校验数据),序号(按顺序发送,收到乱序则丢弃数据),累计确认(接收数据方会发送确认应答,来表示发送的报文收到了),重发机制(定时器,一段时间内无法确认该报文接收到,发送方会重新发送该报文),流量控制(感知对方的接收情况,如果对方接收不够快,会提示对方降低发送频率(调整本地的窗口,并且告知对方窗口值是多少),避免数据报的丢失),拥塞控制(感知网络拥塞情况,能根据拥塞情况来调整数据发送的频率,调整拥塞窗口,避免数据报的丢失),通过这些来保证可靠传输),提供全双工通信,面向字节流传输

TCP字节流:TCP协议将网络层传输的数据看成字节流,会从字节流中选择长度来创建数据段(拆分),这个数据段就成了TCP数据报的数据,接收方接收数据时,还需要对数据进行排序(根据序号,合并)

TCP粘包:发送的数据,在接收方被粘在一块了(排序),一个数据包的头部接着另一个数据的尾部,导致原因是接收数据时,并不会马上交付数据,而是存储在流量控制的缓存中,交付数据时就可能读取到TCP粘包

TCP首部由16位源端口,16位目标端口,32位序号(传输的字节都有唯一序号,表示数据报的数据的第一个字节的序号),32位确认号(表示前面多少个数据收到了,如果有下一个数据请发送给我,例如ack=11,表示前面10个数据已经收到,可以发送第11个数据了,表示期待收到下一个字节序号是什么,传输下一个数据报的数据取决于这个,序号+当前数据长度的和就是下一个数据发送的起点序号),4位数据偏移(首部长度,最大长度1111,就是15,表示有15行,每行4字节,最大60个字节,单位为4字节,长度是20(最少20字节)到60字节之间,表示真实数据距离首部有多长),保留字段,6位的TCP标记(有6位不同的控制位,分别为URG(Urgent,紧急位,URG=1,表示该数据是紧急数据,接收端会更优先获取该数据),ACK(Acknowledgenent,确认位,ACK=1时确认号才生效),PSH(Push,推送位,PSH=1时表示尽快将该数据交付应用层,不需要等缓存填满交付),PST(Reset,重置位,RST=1时通知重新建立TCP连接),SYN(Synchronization,同步位,SYN=1,ACK=0时表示需要连接建立请求,ACK=1时表示连接请求报文),FIN(Finish,终止位,FIN=1时,表示数据发送完成,开始断开连接操作)),16位窗口(表示本地可以接收的数据最大多少,字节为单位,流量控制的基础,可变),16位校验和(差错控制,发送方计算全部数据的校验和,接收方也计算校验和,当接收方的校验和和发送方一致时,数据发送正确),紧急指针(搭配URG控制位使用,指定紧急数据在报文的位置),可选的TCP选项(最大40字节),以及填充(填充32位的整数倍)组成

TCP首部除了填充,TCP选项外,剩余是固定20个字节的长度的

可靠传输协议:停止等待协议(发送方发送数据,只有当接收方响应确认后,再发送另一个数据,停止是发送方的停止发送另一个数据,等待是接收方等待数据的传输,获取到了响应一个确认,如果接收方在一段时间内没有响应确认消息,发送方会重发该数据给接收方(超时重传,超时定时器)),连续ARQ协议(连续发送多个报文,批量发送,通过滑动窗口,来确认发送多少个报文,当报文确认号到达,将移动窗口,让其可以发送后面的报文,累计确认)

TCP可靠传输基于连续ARQ协议,滑动窗口是以字节为单位,窗口首个字节就是确认号(期望下一个发送该字节),发送字节的长度等于确认号+窗口大小,移动窗口的前提是已经接收到确认了,可用窗口等于窗口长度-已发送未确认的,如果窗口首个字节长时间没有确认,将重新传输该窗口的全部字节(哪怕已经接收到)

因为重传窗口的全部字节效率低,因此有选择重传,可以指定重传的字节,每个字节都有32位序号,提供序号就可以选择性重传,选择重传的数据存储在TCP选项内部,因为TCP首部最大60字节,因此TCP选项最大40字节,也就是10个序号(一个序号4字节),能存储的序号太小,因此实质上存储的是重传的字节边界,重传开头字节到结尾字节,就是2个协号表达一段需要重传的字节,这会增加了重传字节的数量,而不是每次只能重传10个字节,而是能重传数百个,数万个字节,因为丢失字节的数量是非常巨大的,要么没有问题,一出问题就是字节丢失很多

流量控制(提示发送方的发送数据的频率不要太快(避免接收方处理不及时,而导致数据丢失),通过限制滑动窗口的大小来实现,窗口指明发送的数据量是多少)

发送方发送数据时携带SEQ序号,表示该报文的序列号,接收方进行响应时,会返回ACK确认号(表明接收到哪个报文了),如果想提示发送方的窗口要设置多大合适,还可以响应一个RWND来表示发送方应该设置窗口大小为这个

ACK=101,RWND = 1000,将表示下一个发送序号为101的报文,并且窗口为1000,也就是说可以一次传输101到1100之间的报文

通过窗口大小来通知对方的发送速率,来做到流量控制,超时重传只针对数据的,对于响应消息是不会触发重传的,如果窗口控制的消息丢失了,将可能导致死锁(如果之前设置RWND为0的话,需要等待响应调整窗口,窗口消息丢失,接收方和发送方都在等待对方的回应)

坚持定时器:当接收到RWND为0的消息时,启动坚持定时器,坚持定时器将每隔一段时间发送窗口探测报文,询问接收方是否有调整窗口的大小的操作,避免因为窗口消息的丢失而死锁的情况发送

拥塞控制(硬件设备传输速率不同或者网络设备故障,因此存在网络拥塞的情况,例如报文超时,这个也是被认为网络拥塞了)

拥塞控制算法:慢启动算法(从小到大逐渐增加发送量,当发送的报文接收到了,将增加发送量,逐渐试探网络是否拥塞了,会指数增长发送量,直到慢启动阈值(ssthresh)),拥塞避免算法(当慢启动算法达到慢启动阈值时启动,控制拥塞窗口,会试探扩大拥塞窗口(直线增长),直到发送网络拥塞为止)

三次握手(通过TCP首部的TCP标记完成,ACK,SYN,FIN)

第一次握手:SYN=1,seq=x,seq是序号,请求建立连接方向目标发送

第二次握手:SYN=1,ACK=1,seq=y,ack=x+1,ACK确认收到请求,seq的值是数据序号,ack=x+1,是希望下次接收的数据的序号

第三次握手:ACK=1,seq=x+1,ack=y+1,ACK确认,seq是当前发送的数据序号,ack是期望下次接收的序号

发送方负责同步和建立连接,接收方负责监听和同步数据已接收响应,建立连接

三次握手的作用不只是建立连接,而且还可以同步数据的序号,以及希望下次接收数据的序号,避免失效的请求建立连接报文(超时的)而导致错误,第三次握手消息,会让接收方忽略超时的失效的建立连接报文(因为超时没有响应,会重发请求)

四次挥手(TCP连接的释放)

第一次挥手:FIN=1,seq=u,数据传输完毕,需要终止TCP连接

第二次挥手:ACK=1,seq=v,ack=u+1,被终止方依然可以发送数据,因为只是主动终止方发送完毕数据了,对方并不一定完成了,需要等待对方发送完毕

第三次挥手:FIN=1,ACK=1,seq=w,ack=u+1,被终止方发送数据完毕,也可以终止了

第四次挥手:ACK=1,seq=u+1,ack=w+1,请求终止方确认已经接收到对方可终止的请求后发送,可以释放了

等待计时器:请求终止方需要等待计时器后才进行关闭,而被终止方接收到第四次挥手消息后是立刻关闭,这个计时器又叫2MSL计时器,即报文最大生存时间的2倍(MSL,Max Segment LIfetime,最长报文段寿命,一般为2分钟)

等待计时器的作用是确保第四次挥手消息到达对方,如果对方在2MSL内没有接收到,会重新发送第三次挥手消息,确保全部报文在连接中失效,端口占用

套接字(ip和端口的组合,Socket,表示TCP连接的一端,用来数据发送和接收)

TCP连接使用2个套接字来组成(C/S架构)

服务端创建套接字,绑定套接字,监听套接字,接收或者处理消息

客户端创建套接字,连接套接字,发送消息

套接字编程(使用Python完成)

服务端

import socket
def server():
    s = socket.socket() #创建套接字
    host = '127.0.0.1'
    port = 8080
    s.bind((host,port)) #绑定套接字
    s.listen(10) #监听
    addr = s.accept() #接收对方发送的消息
    addr.send('hallo word') #向对方发送消息
    addr.close() #关闭连接
if __name__ == '__main__':
    server()

客户端

import socket
def client():
    s = socket.socket() #创建套接字
    s.connect('127.0.0.1',8080) #连接端口
    print(s.recv(1000)) #接收服务端消息
    s.close() #关闭连接
if __name__ == '__main__':
    client()

应用层(对接用户的一层,定义应用与应用之间的通信规则)

应用层常见协议:HTTP,SSH,DNS,FTP,SMTP,POP3,Telnet

DNS(Domain Name System,域名系统)

使用域名来代替IP的点分十进制,通过DNS服务,可以将域名映射出源IP地址(这个源可能是源服务器,也可能是代理服务器,缓存服务器,CDN服务器)

域名由点,数字,字母组成,这个字母不区分大小写,点分割不同域(这里的域主要分顶级域,二级域,三级域)

例如:blog.zhizheng123.test.com,.com就是顶级域,zhizheng123.test.com是二级域,blog.zhizheng123.test.com是三级域

顶级域分成通用顶级域和国家(地区)顶级域,例如.cn,.com,.org,.net,.gov

顶级域搭配二级域就是可以完成一个IP映射服务了

DNS服务部署在DNS服务器上(域名服务器),根域名服务器(管理所有顶级域,全世界目前只有13台),顶级域名服务器(负责顶级域的DNS解析工作),域名服务器(负责二级域的解析工作)

DNS解析过程:计算机访问本地域名服务器查询,如果本地域名服务器没有缓存,则直接向根域名服务器请求,这个顶级域是属于哪个顶级域名服务器的,根域名服务器会返回对应的顶级域名服务器信息,本地域名服务器然后对顶级域名服务器查询,这个二级域名应该属于哪个域名服务器,再访问域名服务器,最后获取映射的IP

本地域名服务器决定了DNS解析的时长,一个好的本地域名服务器可以减少向根,顶级,域名服务器的请求,例如公共域名服务器,114.114.114.114,8.8.8.8,119.29.29.29,223.5.5.5,180.76.76.76

域名由 ICANN 管理全世界的域名系统工作

DNS也会被缓存到本地计算机内,浏览器缓存,操作系统缓存,因此实质上是先访问浏览器缓存,没有再访问操作系统缓存,再然后才到本地域名服务器

DHCP协议(Dynamic Host Configuration Protocol,动态主机设置协议)

DHCP协议是局域网协议,调用UDP协议的应用层协议,提供即插即用联网服务(不需要手动设置IP,而是使用DHCP协议提供的服务,动态设置IP)

DHCP协议提供的是临时IP,具有租期性(过期了会回收,当然也可以续租),提供DHCP协议服务的是DHCP服务器,该服务器通过监听默认端口67,计算机通过UDP协议进行广播DHCP发现报文,因为当前计算机还没有分配IP,会通过设置ip的位全为1,就是255.255.255.255为UDP协议报文的ip,表示这个报文是广播报文,DHCP服务器接收到发现报文后发出DHCP提供报文,计算机接收DHCP提供报文,知晓该网络提供DHCP服务,计算机会向DHCP服务器发送DHCP请求报文,DHCP接收请求并且回应,提供IP地址

HTTP协议(HyperText Transfer Protocol,超文本传输协议)

HTTP协议是调用TCP协议的应用层协议,基于TCP的数据可靠性传输

服务端处理过程:接受客户端TCP连接,接收请求报文(HTTP请求方法有很多种,常见的有GET,POST,DELETE,UPDATE,PUT等等),处理请求,访问资源,生成响应报文,发送响应报文给客户端

请求报文由请求方法,请求地址,HTTP版本,请求头,请求内容组成

响应报文由HTTP版本,响应状态码,状态解释,响应头,响应内容组成

HTTPS是在HTTP协议的基础上使用了SSL(Secure Sockets Layer,安全套接层),数字证书加密通信,SSL证书由可信任组织(CA机构)颁发给所有人的,CA机构颁发的证书就叫CA证书,CA证书有很多种,SSL证书是CA证书的一种,数字证书主要由证书序列号,签名算法,有效期,所有人名称,所有人公开密钥组成

SSL提供了数据加密传输,数据不可篡改等功能,应用层的数据交付给传输层会经过SSL的加密传输

先进行443端口的TCP连接,SSL安全握手,完成安全握手后就可以对数据进行加密解密

SSL安全握手的过程:

客户端向服务端发送协议版本,支持的加密算法,随机数1

服务端回应,发送确定的加密算法,数字证书,随机数2

上面2次是不进行加密传输的,下面的才进行加密传输

客户端会先检查数字证书有效性,使用数字证书提供的公开密钥对随机数3进行加密,并且将加密数据发送给服务端

服务端接收到加密数据时,使用私有密钥解密这个随机数3

客户端和服务端会根据之前生成的随机数1,随机数2,随机数3和确认的加密算法生成对称密钥

客户端和服务端将使用这个对称密钥来进行加密和解密传输,这个对称密钥只有客户端和服务端知道,外人并不知道(因为随机数3是使用数字证书的公钥加密的,这个随机数3只有客户端和服务端解密后知道)