一、网络基础
1.1为什么需要网络通信?
进程间通信解决的是本机内通信,而网络编程就是最后一钟进程间通信的方式------套接字通信
网络通信解决的是任意不同机器通信
1.2实现网络通信需要哪些支持?
a)通信设备
网卡:PC机自带
路由器,交换机
光纤、电缆、基站
b)通信协议
操作系统自带协议栈(Linux的特点:丰富的网络协议)
逻辑开发需要的独立的协议栈
c)简单网络通信只需要学会使用API
1.3、TCP/IP协议栈
1.3.1什么是通信协议?作用?
通信协议即双方实体完成通信或服务所必须遵守的规则和约定。
通信协议三要素:
1.语法:即如何去进行通信,包括数据的格式,编码,信号的等级。
2.语义:即通信的内容,数据内容,含义及控制信息
3.定时规则:即合适通信,明确通信的顺序,速率匹配,排序
特点:
具有层次性,可靠性,有效性
TCP/IP协议分成俩个不同的协议:
TCP:用来检测网络传输中差错的传输协议
IP:专门负责对不同网络进行互联的互联网协议
1.3.2OSI七层网络模型、Linux四层网络模型
协议栈为什么要分层?
1.分层之间是独立的
2.增加了灵活性
3.结构上可分隔开
4.易于实现和维护
5.能租金标准化工作
如图:
(1)物理层:比特
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
通信介质的信号到数据信号(二进制0101)转换
(2)数据链路层:帧
定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
局域网之间计算机通信通过MAC地址(物理网卡)通信
1)MAC地址:
Medium Access Control,直译为介质访问控制,它通常被固化在每个以太网网卡
MAC(硬件)地址长48位(6字节),采用十六进制格式(后24位厂家提供)
2)什么是交换机?
交换机是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意俩个网络节点提供独享的电信号通路。
3)交换机的功能与作用
学习MAC地址:
交换机了解每一端口相连的MAC地址,并将地址同相应的端口映射起来,并存放在交换机缓存中的MAC地址表中。如果接收到新的端口回应,它可以学习新的MAC地址并记录好。
转发数据帧:
当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口
链接不同网络:
交换机除了能够连接同种类型的网络之外,还可以在不同类型的网络之间起到互连作用。如今许多交换机都能提供支持快速以太网或FDDI等的高速连接端口,用于连接网络中的其它交换机或者为带宽占用量大的关键服务器提供附加带宽。
划分局域网:
交换机可以像网桥那样,将局域网分为多个冲突域,每个冲突域都是有独立的宽带,因此大大提高了局域网带宽。
(3)网络层:数据报
在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
IP地址,路由(通过公网IP来访问全世界)
(4)传输层 :报文段/用户数据报
定义了一些传输数据的协议和端口号(WWW端口80等),如:
TCP(传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)
UDP(与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
端口:让不同的应用程序,同时使用网络
(5)会话层
通过运输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
控制发包的数据
(6)表示层
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
文件格式
(7)应用层:报文
应用程序使用
1.4网络层
网络层(network layer)主要包括以下两个任务:
(1) 负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。
(2) 选中合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。
协议:IP,ICMP,IGMP,ARP,RARP
1.4.1 IP地址
实际上是32位二进制数(01100100.00000100.00000101.00000110)100.4.5.6
1.4.2公网IP(广域网通信)
a类:1.0.0.1~126.255.255.254
b类:128.0.0.1~191.255.255.254
c类:192.0.0.1~223.255.255.254
d类:224.0.0.1~239.255.255.254
e类:240.0.0.1~255.255.255.254
1.4.3私网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
1.4.4本地回环地址
被用于通过本地回环网络接口,来访问本机运行的服务,并且将会绕过任何物理网络接口硬件
1.4.5如何解决IP地址慌
IPV4(32位)升级到IPV6(128位)
网络地址转换NAT(Network Address Translation):将内网IP转为公网IP
1.4.6子网掩码的作用
决定一个网段的大小(可用IP的数量)
统一网段的IP地址,才能互相通信,不同网段的IP地址,需要路由器才能相互通信
1.4.7ARP协议
"Address Resolution Protocol"(地址解析协议)
把IP地址解析成MAC地址(物理地址,唯一)(局域网通信必须通过MAC地址)
ARP攻击(什么是ARP攻击):
ARP攻击就是通过伪造IP地址和MAC地址来实现ARP欺骗,通过在网络中制造大量的ARP通信量是网络阻塞,攻击者只要持续不断的发出伪造ARP响应包就能更改目标机ARP缓存中的IP-MAC条目,造成网络中断或者中间人攻击,因此ARP攻击通常也被称为ARP欺骗。
尽管ARP攻击仅能在以太网进行且门槛很低,造成的影响却很大,比如会出现断网攻击、流量被限、账号被盗等情况。网络运维可以采取ARP防御机制,比如通过在交换机部署网络镜像,抓取可以数据包分析,也可以结合DHCP侦听、IP源防护等计数,维护网络安全。
1.4.8 ICMP协议
用来检测网络通信故障和实现链路追踪,最典型的应用就是ping和tracerooute
死亡ping
1.5传输层
负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能
复用,就是多个应用层进程可同时使用下面运输层的服务。
分用,就是把收到的信息分别交付给上面应用层中相应的进程。
运输层主要使用以下两种协议:
(1) 传输控制协议TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
(2) 用户数据包协议UDP(User Datagram Protocol):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付”。
1.5.1 TCP协议(传输控制协议)
特点:面向连接、可靠的字节流传输
1.5.1.1为什么说是字节流传输
优点:无需一次存储过大的数据占用太多内存
缺点:无法知道这些字节代表的意义,会导致粘包以及拆包的问题
(1)TCP的报文网段格式:(端口号)
作用:确定和机器上哪个应用程序通信
取值范围:周知/标准端口号,0 - 1023(超级用户权限才能使用)
注册端口号:1024 - 49151(IANA注册服务的注册端口)
私有端口号:49152 - 65535(可任意使用)
特殊端口号: 0:Reserve 1:tcpmux
序列号seq随机生成
(2)TCP标识位
SYN:建立连接
ACK:回应标识
FIN:断开链接
PSH:数据包
URG:紧急指针
RST:重置(重传)
(3)检验方式
奇偶校验Parity Check
bcc异或校验法(block check character)
crc循环冗余校验(Cyclic Redundancy Check)
md5校验和数字签名
海明码校验
1.5.1.2 TCP为什么说是可靠传输
(1)停止等待协议
A给B发包,B回复收到,A继续发下一个包
缺点:每一次发包都可能丢失,若包丢失,B永远无法回复,A一直等待
(2)超时重传
A发出包开始计时,若规定时间未到,则认为包丢失,再次发送、重传
缺点:若包没丢失,等待时间较长,B会收到两个包,无法辨别
(3)序号和确认号
表示发送方数据第一个字节的编号,和接受方期待的下一份数据的第一个字节的编号
(4)连续ARQ协议
为什么要有连续ARQ协议?
停止等待满足可靠传输,当效率太低,等待过程中浪费资源
解决办法:
连续放松数据包
A源源不断地发送,B源源不断地接收,并注意确认回复
累计确认:累计收到一定数量,回去之前的包全部收到
缺点:
发送太快导致接收方无法接受,便频繁进行重传,浪费网络资源。
如何处理丢包问题?
选择确认SACK:在TCP报文的选项字段,可以设置已收到的报文段,每个报文段需要两个边界来进行确定。
(5)TCP的流量控制
滑动窗口:发送方需要根据接收方的缓冲区大小,设置自己的可发送的窗口大小,处于窗口的数据表示可发送,之外的数据不可发送。
当窗口内的数据接收到确认回复时,整个窗口会往前移动,知道发送完所有的数据。
(6)可靠传输小结
通过连续ARQ协议与发送-确认回复模式来保证每一个数据包都能到达接收方
通过给字节编号的方法来标记每个数据是属于重传还是新的数据
通过超时重传的方式来解决数据包在网络中丢失的问题
通过滑动窗口来实现流量控制
通过累计确认 + 选择确认的方法来提高确认回复与重传的效率
(7)拥塞控制
为什么要有拥塞控制?不是有流量控制了吗?
前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大....
所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。
于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
作用:避免网络过分拥挤导致丢包严重,网络效率降低
(8)拥塞控制VS流量控制
流量控制是拥塞控制的手段:为了避免阻塞,必须对流量进程控制
拥塞控制的目的是:限制每个主机的发送的数据量,避免网络拥塞使效率下降
解决方法:
拥塞控制的解决方法是流量控制,流量控制的实现是滑动窗口
拥塞控制最终于是通过限制发送方的滑动窗口大小来限制流量
拥塞控制的4个重点:慢开始、快恢复、快重传、拥塞避免
解决原理:
最开始的时候,会把窗口设置一个较小的值,然后每轮变为原来的两倍。这是慢开始
当窗口值到达ssthresh值,这个值是需要通过实时网络情况设置的一个窗口限制值,开始进入拥塞避免,每轮把窗口值提升1,慢慢试探网络的底线,如果发生了数据超时,表示极可能发生了拥塞,然后回到慢开始,重复上面的步骤
如果收到三个相同的确认回复,表示现在网络的情况不太好,把ssthresh的值设置为原来的一半,继续拥塞避免。这部分称为快恢复
如果收到丢包信息,应该尽快把丢失的包重传一次,这是快重传。
1.5.1.3什么是面向链接
链接:链接不是实实在在的链接,而是通信双方彼此之间的一个记录。
TCP是一个全双工通信,也就是可以互相发送数据,所以双方都需要记录对方的信息(源IP、源端口号、目标端口号)
(1)建立链接:三次握手
目的:交换彼此的信息,然后记住对方的信息
三次握手:上次消息的发送,称之为三次握手
机器A发送SYN包,向机器B请求建立TCP链接,并附加上自身的接收缓冲区信息等,机器A进入SYN_SENF状态,表示请求已经发送正在等待回复。
机器B收到请求之后,根据机器A的信息记录下来,并创建自身的接收缓冲区,向机器A发送SYN+ACK的合成包,同时自身进入SYN_RECV状态,表示已经准备好了。
机器A收到回复之后记录机器B的信息,发送ACK信息,自身进入ESTABLISHED状态,表示已经完全准备好了,可以进行发送和接收。机器B收到ACK数据后,进入ESTABLISHED状态。
(2)断开链接:四次挥手
机器A发送完数据后,向机械B请求断开链接,自身进入FIN_WAIT_1状态,表示数据发送完成且已经发送FIN包(FIN标志位为1)
机器B收到FIN包后,回复ACK包,表示已经收到,但此时,机器B可能还有数据没发送完成,自身进入CLOSE_WAIT状态,表示对方已发送完成且请求关闭链接,自身发送完成之后可以关闭链接
机器B发送完数据后,发送FIN包给机器A,自身进入LAST_ACK状态,表示等待一个ACK包即可关闭链接。
机器A收到FIN包之后,知道机器B也发送完成了,回复一个ACK包。并进入TIME_WAIT状态。
机器A等待俩个报文存货最大时长之后,机器B接收到ACK报文之后,均关闭连接,进入CLASED状态
(3)拒绝服务攻击(DOS):
通过各种计数手段导致目标系统进入拒绝服务状态的攻击。
(4)分布式拒绝服务攻击(DDOS)
利用合理的请求造成资源过载,导致服务不可用,从而造成服务器拒绝正常流量服务。
(5)SYN_Flood攻击:
就是客户端不返回最后的ACK包,这就形成了半开连接,TCP半开连接是指发送或者接收了TCP的链接请求,等待对方应答的状态,半开链接状态需要占用系统资源以等待对方应答,半开连接数达到上限,无法建立新的连接,从而造成拒绝服务攻击
(6)TIME_WAIT状态:
当机器A收到机器B的FIN包时,理想状态下,确实是可以直接关闭链接了。
问题1:当网络不稳定时,可能机器B放了一些数据还没到(比FIN包慢)
问题2:同时回复的ACK包可能丢失,机器B会重传FIN包
问题3:此时机器A马上关闭链接,导致数据不完整、机器B无法释放链接等问题|机器A收到FIN包之后,知道机器B也发送完成了,回复一个ACK包。并进入TIME_WAIT状态
解决方法:此时机器A需要等待两个报文生存最大时长,确保网络中没有任何遗留报文了,再关闭链接。
(7)粘包与拆包
应用层需要向目标进程发送两份数据,一份音频,一份文本,TCP只知道接收一个流,并把流拆分成4段进行发送,中间第二个报文的数据就出现两个文件的数据混在一起,称为粘包。
目标应用层再接收数据后,需要报这些数据拆分成正确的两个文件,就是拆包。
粘包与拆包都是应用层需要解决的问题,可以在每个文件的最后附加上一些特殊字符,如换行符4
1.5.2 UDP协议(用户数据报协议)
特点:无连接、不可靠传输
UDP传送数据前并不与对方建立链接,对接收的数据也不发送确认信号,发送端不知道数据是否会正确接收,不需要重发。
UDP中的每个数据包都是一个独立的信息,包括完成的源或目的地址,它在网络上以任何可能的路径传往目的地,对于能否达到目的地,达到目的地地时间及内容地正确性都是不能被保证的。
因为UDP不必进行收发数据的确认,而且资源消耗小,处理速度快,所以它的实时性更好,传送速率更高
1.5.2.1 UDP的报文格式:
源端口、目标端口号:区分主机的不同进程
校验码:校验数据包在传输的过程中没有出现错误,例如某个1变成0
长度:报文的长度
1.5.2.2 UDP的功能
校验数据报是否发生错误
区分不同的进程通信
1.5.2.3 优缺点
优点:
效率更快,无需建立连接以及拥塞状态
链接更多的用户,没有链接状态,不用为每个用户创建缓存等
分组首部字节少,开销小,TCP首部固定首部是20字节,而UDP只有8字节,更小的首部意味着更大的数据部分
在一些需要高效率允许的可限度误差的场景下可以使用,如直播场景
可以进行广播,UDP不是面向链接的,所以可以同时对多个进程进行发送报文
缺点:
无法保证消息完整、正确到达,UDP是不可靠的传输协议
缺少拥塞控制,容易互相竞争资源,导致网络系统瘫痪
1.5.2.4 UDP使用场景
视频直播、DNS、RIP路由选择协议
1.5.3 TCP VS DUP
链接方式:
TCP是面向链接
UDP是无链接
可靠性:
TCP是可靠传输,适用流量控制和拥塞控制
UDP是不可靠传输,不适用流量控制和拥塞控制
链接对象的数量:
TCP只能是一对一通信
UDP支持一对一,一对多,多对一和对多交互通信
传输方式:
TCP是面向字节流
UDP是面向报文
首部开销:
TCP首部最小20字节,最大60字节
UDP适用于实时应用(IP电话、视频会议、直播等)
1.6应用层
1.6.1 DNS(Domain Name System:域名系统)
作用:
解决IP地址复杂难以记忆的问题,存储并完成自己所管辖范围内主机的域名到IP地址的映射
域名解析的顺序:
浏览器缓存
找本机的hosts文件
路由缓存
找DNS服务器(本地域名、顶级域名、根域名)->迭代解析、递归查询
域名由点、字母和数字组成:
顶级域(com,cn,net,gov,org)
二级域(baidu,taobao,qq,alibaba)
三级域(www)
1.6.2 HTTP(HyperText Transfer Protocol:超文本传输协议)[TCP,端口80]
1.6.3.1 C/S结构
优点:
具有分布性特点,可以随时随地进行查询、浏览等业务处理
业务扩展简单方便,通过增加网页即可增加服务功能
维护简单方便,只需要改变网页,即可实现所有用户的同步的更新
开发简单,共线性强
缺点:
需要专门的客户端安装程序,分布功能弱,针对点多面广且不具备网络条件的用户群体,不能够实现快速部署安装和配置。
兼容性差,对于不同的开发工具,具有较大的局限性。若采用不同工具,需要重新改写程序
开发成本较高,需要具有一定专业水准的技术人员才能完成
1.6.3.2 B/S结构
优点:
具有分布性特点,可以随时随地进行查询、浏览等业务处理
业务扩展简单方便,通过增加网页即可增加服务功能
维护简单方便,只需要改变网页,即可实现所有用户的同步的更新
开发简单,共享性强
缺点:
要表达到C/S程序的程度要花费不少精力
在速度和安全性的需要花费巨大的设计成本(B/S最大问题)