计算机网络概述
一组网络设备,通过某种有形(如网线)或者无形(如WiFi)的媒介连接起来,并且按照一定的通讯规则(也就是协议)来进行通讯的集合
网络分类
局域网(Local Area Network, LAN)
概念: 局域网是将一个比较小的区域内各种通信设备互连在一起组成的计算机网络 特点: 私有服务 分布范围较小 结构简单,布线容易 网络速度较快 常见物理组件 互联组件:NICs ( 网卡)、Media (线缆) Network devices 设备 交换机switches,工作在数据联络层
作用:将接入交换机的任意两个网络节点提供独享的电信号通路
传输方式:全双工
工作原理 在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC 表,在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口 多端口中继器Hubs(集线器) ,工作在物理层
基于广播机制,信息包会发送给集线器中所有客户端,所有客户端在一个冲突域和广播域中
Hub并不记忆该信息包是由那个MAC地址发出,那个MAC地址在Hub的那个端口
Hub的特点,半双工,共享带宽
可以当信号放大器,延伸网线最大传输距离
广域网 (Wide Area Network, WAN) 概念 规模最大的一种计算机网络,为公众提供公共服务,由不同ISP组建,为用户提供各种网络接入和应用服务 特点 覆盖范围广 构建成本高 网络结构和类型复制 传输速率不高 常见物理组件,路由器route,工作在网络层 可以分割广播域 选择路由表中到达目标最好的路径 维护和检查路由信息 连接广域网 连接不同的网段 路由器可以做安全控制,比如ACL权限
查看路由表 ip route; netstat -r; route; windows中route print
按传输方式分
点对点传输网络 在点对点传输网络中,数据是以点对点的方式在计算机设备中传输,也就是某个端口只能和它相接、相连的对端端口进行通信,不能把数据发送到本网络的其他链路中。 广播式传输网络 使用由网络上的所有节点共享的公共信道进行广播传输的计算机网络,是一种一点对多点的网络结构。
广播式传输网络中传输信息时,任何一个节点都可以发送数据包,通过公共信道传送到网络中的其他计算机上,这些计算机根据数据包中的目的MAC地址进行判断,如果自己的MAC地址与目的MAC地址匹配则接受(与此同时,发送节点就可以知道与目的IP地址对应的MAC地址,下次接收到包括同样目的IP地址的包时就不用再广播了),否则便丢弃它。
通讯模式
模式:
单播(unicast):数据传送目标地址为一个主机,其他主机也可以得到,但是会过滤地址,可以通过更改网卡为混杂模式截取
广播(broadcast):数据传送给一定范围内的主机,有可能造成网络干扰(网络风暴),效率较高
组播(multicast):数据传输给一部分主机
方式:
单工:单向发送数据,不能回传,如电视,收音机等
双工
半双工:可以互传,但不能同时传,如对讲机
全双工:同时传输,如手机打电话
网络拓扑结构
节点
可以看做是网络端口,分为“转节点”和“访问节点”,“转节点”作用是支持网络的连接,通过通信线路转接和传递信息,如交换机、网关、路由器、防火墙设备的各个网络端口。访问节点是信息交换的源点和目标点,通常是计算机上的网卡接口。
结点
是指一台网络设备,通常链接了多个节点,结点又分为链路结点和路由结点,分别对应网络中的交换机和路由器
链路
指两个节点间的线路,分为物理链路和逻辑链路,前者是实际存在的通信线路,后者是指逻辑上起作用的网络通路,由网络体系中的数据链路层标准和协议来实现
通路
从发出信息的节点到接收信息的节点之间的一串节点和链路的组合,可以包括多条链路
冲突域(collision domain)
在同一个网络上两个比特同时进行传输则会产生冲突,就认为发送这两个比特的设备在同一个冲突域中
广播域(Broadcast Domain)
指网络中的某一设备同时向网络中所有的其它设备发送数据,这个数据所能广播到的范围即为广播域
拓扑结构分类
总线拓扑
所有设备均可接收信号,所有设备都在一个冲突域中,网络可靠性相对不好,会产生信号反射,需要在终端设置50欧姆的电阻终结器回收信号。
环状拓扑
信号绕环传输,单一传输点
双环拓扑
信号沿相反方向传输,比单环的复原能力更强。例如FDDI技术,平时沿着主环传送,当出现故障时,会启用备用的内环反向传输
星型拓扑
通过中心点传输 存在单点失败可能
扩展星型拓扑
比星型拓扑的复原能力更强
全网状拓扑
容错能力强 实施成本高 用于骨干网比如电信或者军方
部分网状拓扑
全网拓扑的简化,在容错能力与成本之间平衡
逻辑拓扑
逻辑拓扑描述了信息在网络中流动的方式
网络模型分层
降低复杂性
标准化接口
简化模块化设计
确保奇数的互操作性
加快发展速度
简化教学
物理层(Physical Layer)
二进制传输 ,单位为bit(0101) 为启动、维护及关闭物理链路定义了电气规范(例如网线接口,电缆)、机械规范、过程规范和功能规范
数据链路层(Data-Link Layer)
数据的单位称为帧(frame) 访问介质 mac物理地址就是在这层实现 分为两个子层,偏硬件物理部分主要负责的是 MAC (Media Access Control)。 偏向软件的部分主要在多任务处理来自上层的封包数据 (packet) 并转成 MAC 的格式, 负责的工作包括讯息交换、流量控制、失误问题的处理等
网络层 (Network Layer)
数据的单位称为数据包(packet) 数据传输 解决远距离访问问题 单位为包package/packet,IP、IPX协议 解决不同网络差异,寻找不同网络间能共同遵守的通信规范 提供路由选择 数据包封装和解封装 选择传递数据的最佳路径 支持逻辑寻址和路径选择 逻辑地址是基于管理目的认为分配的
传输层(Transport layer)
TCP的数据单元称为段(segments),UDP协议的数据单元称为“数据报(datagrams) TCP、UDP、SPX协议 确保数据传输的可靠性 建立、维护和终止虚拟电路 物理上将链路连通后,需要在传输层建立逻辑上的桥梁,确定信号是否连通 通过错误检测和恢复 尝试重新传输 信息流控制来保障可靠性
会话层(Session layer)
在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文 会话层不参与具体的传输,提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
表示层(Presentation layer)
这一层主要解决用户信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责
应用层(Application layer)
为应用程序进程(如、电子邮件、文件传输和终端仿真)提供网络服务
应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等
数据封装解封
对等通信
双方是对等层次的会话才可能使用同类型的协议,彼此才能通信
在网络体系结构中,每一层都是独立完成自己工作的,其他曾是不干预的
PDU:Protocol Data Unit,协议数据单元是指对等层之间传递的数据单位
物理层的PDU是数据为bit 数据链路层的PDU是数据帧frame 网络层的PDU是数据包packet 传输层的PDU是数据段segment 其他更高层次的PDU是消息message
封装
在发送方客户端进行的 在整个数据传输过程中,数据在发送端时经过各层都要附加上相应层的(HDR)报头,因为第二层 (数据链结层) 主要是位于软件封包 以及硬件讯框 中间的一个阶层,所以还会加上一个协议尾,也就是FCS校验位(利用综合算法算出一个数,接收端通过同样的算法FCS,复核传输数据的正确性) 报头是用来封装本层PDU(对等层之间传送数据单位,不同层的PDU内容和格式不同) 数据过大时,先将数据分成数个部分,再将每个部分分别封装。 各层报头命名 应用层AH 协议层PH 会话层SH 传输层TH 网络层NH 数据链路层DH
解封
在接收方客户端进行
接收端数据由低向高传输,数据到达某一层厚,就会去掉对应下层的报头,因为上层不需要了解它的下层服务,所以当包送到某一层就会把用来标识它下一层的协议头去掉,还原包在发送端对应层时的内容
Ethernet Frame结构
数据链路层
一些软件处理数据的时候,会将前导信息和校验位去掉,实际看到的数据是中间部分
Preamble
8个字节的前导信息
Destination Address
6个字节的目标物理地址 MAC地址。
MAC地址 分为两部分前面为IEEE 指定的号,后半部分为厂家指定的,共48位唯一的地址。
Source Address
6个字节的源地址
Type /length
type,2个字节上层协议的标识,上层协议类型很多,需要据此识别
早期只有IPX一种协议,所以这个位置使用length
协议类型查看 cat /etc/protocols
Data
46-1500字节的数据,包括各层封装的的头部
FCS
校验位
载波侦听多路访问CSMA/CD
载波侦听
判断网络中有没有传输
多路存取
同时多人传输
冲突
造成冲突
退避算法
数据后退等待随机时间,每个数据等待时间不同,排队执行,如果后退数据仍然冲突,就会将等待时间×2,累计达到16次就会认为是网络故障 ,
认为超过1024台机器发生冲突的几率就非常大,可能造成网络通讯失败
以太网桥的工作原理
以太网桥监听数据帧中源MAC地址,学习MAC地址,建立MAC地址表
对于未知的MAC地址,网桥将转发到除该帧的端口之外的所有端口
当网桥接到一个数据帧时,如果该帧的目的位于接受端口所在网段上就过滤掉该数据帧,如果目的MAC地址在位于另外一个端口,网桥就将该帧转发到该端口
当网桥接到广播帧时,它立即转发到除接收端口之外的所有其他端口
VLAN
分隔广播域
安全
灵活管理
TCP/IP协议栈
Transmission Control Protocol/internet Protocol 传输控制协议/因特网互联协议
TCP/IP是一个Protocol Stack 包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
TCP/IP协议栈和OSI模型
应用层
对应ISO模型的5、6、7层即应用层,表示层、会话层,常见协议如下
File transfer
FTP:文件传输协议
TFTP:轻量级的文件传输协议
Network File System
Simple Mail Transfer Protocol
Remote login
Telnet
rlogin
Network management
Simple Network Management Protocol:收集设备状态
Name management
Domain Name System:域名系统
传输层 两大主要协议UDP和TCP
UDP协议:不具备(when required)功能
特点
Best-Effort最大效能 Connectionless非面向连接 不分段,即不编号
用于
E-mail、file sharing、Downloading
特性
工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性
TCP协议:具备(when required)功能
特点
reliable 可靠 Connection-oriented面向连接 分段,编号
用于
音频、视频
特性
工作在传输层
面向连接协议
全双工协议
半关闭,也就是支持单方面关闭
错误检查,通过校验和实现
将数据打包成段,排序
确认机制
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法
Internet层
对应ISO模型的网络层
网络访问层包括
数据链路层:对应ISO模型的数据链路层
物理层 :对应ISO模型的物理层
TCP包头
源端口、目标端口:
1.下层要为上层的协议服务,靠端口号来标识协议类型。
2计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过制定源端口和目标端口,就可以知道是哪两个进程需要通信。
3.程序用多个端口
4.客户端端口是随机的,服务器端口号是固定的
5.命令ss –nt 可查看服务器端口编号
6.文件 /etc/services 可查看常见软件用的端口号
序列号:seq
1.表示本报文段所发送数据的第一个字节的编号。在TCP链接中所传送的字节流的每个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始
2.客户端的序列号是所有发送数据的编号,在不同的接收端,序列号会从0开始计算,客户端记录的是整体编号。
确认号:ack
表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号
数据偏移:
表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。
它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
标记位6位
URG:表示本报文段中发送的数据是否包含紧急数据。后面紧急指针段(urgent pointer)只有当URG=1时才有效
ACK:表示前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,链接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
PSH:数值为0提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给长层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
RST:重置位如果收到一个RST=1的报文,用来同步序号。
当SYN=1,ACK=0时,表示这是一个请求建立链接的报文段;
当SYN=1,ACK=1时,表示对方同意建立连接。
SYN=1,说明这是一个请求建立链接或同意建立链接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕,如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以私房连接了”,带FIN标志的TCP报文段称为结束报文段
窗口大小
表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,一个包确认一次,窗口大小为1
固定窗口:固定的一次发送多少包,然后确认一次。
滑动窗口:实验性的并发数个报,看对方的回应几个包,通过协商来确定一次能发多少包
校验和
提供额外的可靠性
紧急指针
标记紧急数据在数据字段中的位置
选项部分
其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节,常见选项如下:
1、最大报文段长度:Maxium Segment Size,MSS
指明自己期望对方发送TCP报文段时那个数据字段的长度。比如1460字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在链接建立过程中,双方都要把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中
MTU和MSS值得关系:MTU=MSS+IP Header+TCP Header
通信双方最终协商出来的MSS值=较小MTU-IP Header-TCP Header
2、窗口扩大(Windows Scaling)
为了扩大窗口,由于TCP首部的的号窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项
3、时间戳(Timestamps)
可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32位表示,每2^3个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文
TCP协议端口号(port)
传输层通过Port number,确定应用层协议
1、tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路
端口号数字范围:0-65535
2、udp:User Datagram Protocol,无连接的协议
端口号数字范围:0-65535
3、IANA:互联网数字分配机构(负责域名,数字资源,协议分配)
0-1023:系统端口或特权端口(仅管理员可用),众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh),80/tcp(http),443/tcp(https)
1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用程序使用,1433/tcp(SqlServer),1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp(memcached)
4、49152-65535:动态端口或私有端口,客户端程序随机使用的端口
其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
TCP三次握手
面向连接协议 双方通讯前,要建立链接,发送写测试数据,确认网络为通畅的,以建立虚拟连接,涉及标记位ACK和SYN
三次握手过程
1、A向B发送一个数据包SYN=1(请求和B通讯),seq(A→B电脑发送数据的序号)=x,
2、如果B可以收到,则发送SYN=1(希望A确认B回应的包有没有收到),ACK=1(表示A发送的包收到了,同意通讯),seq=y(表示B对A通讯的第几个包),ack=x+1(希望下次收到的包的序号)
3、A收到B的回应包,再发送ACK=1,seq=x+1,ack=y+1,B收到后,则建立成功
客户端的典型状态转移
1、客户端通过connect系统调用主动与服务器建立建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态
2、connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,链接转移至ESTABLISHED状态
此后connect系统调用可能因为如下两个原因失败返回:
1、如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用,则服务器将给客户端发送一个复位报文段,connext调用失败。
2、如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。
TCP四次挥手
四次挥手过程
1、处于连接状态的双方,其中一方比如(A)没有数据传输了,向B发出一个FIN=1,seq=u的数据包,状态由ESTAB-LISHED切换到FIN-WAIT-1(终止等待1)状态
2、B接收到数据包后向A发送确认信息包ACK=1,seq=v,ack=u+1,同时状态由ESTAB-LISHED切换到CLOSE-WAIT(关闭等待)
3、A收到B的确认包后,转态由FIN-WAIT-1(终止等待1)切换到FIN-WAIT-2(终止等待2),这是已经为半关闭状态,同时B可能仍然有数据没有传输完,继续把剩余数据传送完后,再向A发送结束请求FIN=1,ACK=1,seq=w,ack=u+1同时B进入LAST-ACK(最后确认)状态
4、A收到结束请求后回应ACK=1,seq=u+1,ack=w+1并且进入TIME-WAIT(时间等待),等待2倍的MSL时间,MSL是A与B之间发送数据包的时间。为了避免B向A传输的剩余数据滞后于关闭请求到达,造成数据丢失。
5、B收到结束回应,就会进入CLOSED状态。A在时间等待后,也进入CLOSED状态
挥手过程可能发生的情况
客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接收服务端的报文,该回应报文会有三种可能:
1、只收到服务器的ACK
客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间,RFC 1122标准的建议值是2min)。客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次,因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失
2、只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态
3、同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态
孤儿连接
处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT转态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿链接(和孤儿进程类似)
Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数
1、指定内核能接管的孤儿连接数目
/pro/sys/net/ipv4/tcp_max_orphans
2、指定孤儿连接在内核中生存的时间
/pro/sys/net/ipv4/tcp_fin_timeout
TCP协议涉及状态
有限状态机FSM:Finite State Machine
CLOSED
没有任何连接状态
LISTEN
侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT
在发送连接请求后,等待对方确认
SYN-RECEIVED
在收到和发送一个连接请求后,等待对方确认
ESTABLISHED
代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1
主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2
主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
TIME-WHIT
完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT
被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK
被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING
双方同时尝试关闭传输连接,等待对方确认