tcp,udp一些列问题

news/2024/5/18 12:59:44 标签: tcp/ip, udp, 网络

(tcp,udp基本介绍,三握四挥等)七层模型主要知识点等

OSI七层模型其功能简介
分层机制体现了分治的思想,每一层为上一层提供保障屏蔽异构。
物理层:规定了一系列的物理、电气、接口标准,传输的是比特流,主要实现0,1-电平-0,1的数模转换);
数据链路层:封装成帧,差错检测,透明传输,介质访问控制(MAC子层)。以及还有重要的MAC寻址作用。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及检错和控制信息。
网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。
传输层:最后一公里,端口号,IP是尽力传输,不确保消息的可靠性。TCP,UDP
会话层:会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。
表示层:多种数据格式之间的转换,表示层的数据转换包括数据的加密、压缩、格式转换等
应用层:提供各种各样的应用层协议,为用户与网络之间提供一个打交道的接口。

数据链路层的具体介绍:(就是所谓的局域网,包括共享介质和非共享介质)
封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址
透明传输:零比特填充、转义字符
差错检测(CRC):接收者检测错误,如果发现差错,丢弃该帧

MAC地址48比特,任何一个网卡的MAC地址是唯一的。共享介质型网络主要有以太网,FDDI,用一个信道发送接收信息,基本上是半双工。必须要有介质访问控制方式:争用方式和令牌传递方式

CSMA:先到先得,确认没有其他设备发送数据,立即发数据;接收端如果MAC地址不匹配就丢弃;
忙的话可以一直监听或等一段时间再监听。
CSMA/CD:载波监听多路访问/冲突检测:改进版,发送后一直在监听,如果冲突了,停止发送,延迟重发。
令牌环:不会有冲突,每个点有平等获得令牌的机会,网络拥堵不会造成性能下降。但是在网络空闲时利用率比较低。改进有:令牌追加,多个令牌等。
非共享介质:ATM。全双工。每个点都直连交换机,不会冲突。缺点就是布线成本很高,以及交换机故障,所有相连的点都无法通信。
以太网交换机就是由多个端口的网桥,根据目标MAC地址,决定从哪个接口发送数据。交换机自学的原理:如果转发表中没有该目标MAC的接口信息,执行洪泛操作,那么目标主机会回复,这样就知道了。
环路检测技术:生成树:每个网桥定期交换数据信息,判断哪些端口使用和不使用,一旦故障,就利用不使用的端口通信。 源路由法.
VLAN:虚拟局域网:不用修改实际路线,只需修改网络结构。实际上就是交换机按照端口区分了网段,减少的广播的流量和安全性。
以太网的帧格式:目标MAC地址,源MAC地址,协议,数据,FCS检验序列

知识点:(12个字)功能,包含两个子层:MAC子层和协议子层。协议比如PPP,LCP等。以及其中包含的重要子层MAC子层(共享介质和非共享介质,CSMA,令牌环,虚拟局域网,交换机自学原理)

网络层一些知识(ip地址分类,子网掩码,网关,路由协议等)
可以看到链路层的就是在一个网络里面根据MAC地址通过交换机找到主机以及局域网内信息传输的方式。但是信息如果要传到另一个网络,就需要IP协议了。逻辑互连的网络,可以由多种异构网络互连组成,在网络层上看起来像一个统一的网络。也是屏蔽异构,把异构网络统一成一个大网络

网络层提供服务的特点:网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务,不保证可靠通信
在这里插入图片描述
arp是把IP地址转换为MAC地址的,ICMP是进行差错检测的。
中间设备:用来将网络互相连接

(1)物理层的中间设备:转发器 扩大信号的

(2)数据链路层的中间设备:网桥  交换机(连接不同主机的)

(3)网络层的中间设备:路由器 (连接不同网络的,3层交换机)

(4)网络层以上的中间设备:网关

在这里插入图片描述
一般网络号全为0代表本网络某台主机,可以做源地址不能做目标地址;主机号全为1代表广播。
A: 0-126。 127不行,是回环测试的地址,著名的127.0.0.1(localhost). 其实127.0.0.0-127.255.255.255都是回环测试;
B:128-191
C:192-223

同一局域网上的各IP地址的网络号都是相同的,一个路由器有多个接口,每个接口对应的网络号不同.

划分子网和构造超网
两级IP地址的问题: IP地址空间利用率有时很低(可连接的主机数相差太大)两级IP地址不够灵活(新增网络号麻烦)

划分子网的基本思路:借用主机号若干位作为子网地址
划分子网后的IP地址:| 网络号 | (子网) | 主机号 |
如何确定一个网络是否划分子网以及划分了多少,就需要子网掩码:
子网掩码用来找出IP地址中的子网部分,长度为32位,原IP中网络号和子网部分置为1,主机号部分置为0
(IP地址)and(子网掩码)=网络地址
子网划分后的路由表:包含目的网络地址、子网掩码、下一跳地址

.无分类编址CIDR(构造超网):
它重新将IP地址划分为两个部分即,”网络前缀”和”主机号”.注意这里的网络前缀再也没有位数的限制,即没有A,B,C类之分.
)把网络前缀相同的连续IP地址组成一个CIDR地址块,只要知道任一个地址,就可以知道这个地址块的起始地址和最大地址以及地址数。
格式:使用网络前缀代替网络号和子网号,使IP地址变回两级格式
斜线表示法:/24表示子网掩码前24位为1,即网络前缀的位数
CIDR地址块:把网络前缀都相同的连续IP地址组成CIDR地址块
路由聚合:一个CIDR地址块能表示很多地址,这种地址的聚合称为路由聚合,也称为构成超网;有利于减少路由器之间的路由选择信息的交换,从而提高整个互联网的性能

ARP协议
IP地址与MAC地址:源IP地址和目的IP地址始终不变;而源MAC地址和目的MAC地址在每条链路上都要变化
工作方式:每个主机里都设有一个ARP高速缓存,里面有所在局域网上各主机和路由器的IP地址到硬件地址的映射表,且这个映射表经常动态更新。
ICMP协议
CMP允许主机或路由器报告差错和提供有关异常情况的报告。
在这里插入图片描述
’ICMP的应用:
PING: PING即Packet InterNet Groper,用于探测两台主机间是否连通,源主机向目标主机发送ICMP的回送请求报文(封装在IP数据报中),目标主机若接收到该报文则返回回送回答报文
路由探测traceroute: 路由探测即源主机向目标主机发送无法交付的UDP数据报(封装于IP数据报,若目标主机接收到该数据报,则会返回ICMP终点不可达报文),第一次发送时将IP数据报的生存时间设为1,这样一来第一个路由器接收到后将生存时间-1就会直接判断该IP分组需要丢弃,并返回ICMP时间超过报文,源主机接下来发送第二个IP数据报(依然为不可交付UDP数据报),此次将生存时间设为2……以此类推,直至接收到ICMP终点不可达报文,或生存时间达到上限为止。
可以知道路径经过了哪些路由,就知道哪个点出问题了。

DHCP协议:动态主机配置协议
路由协议
路由表的作用就是存储转发。如果从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器。
路由表更新根据RIP协议或者OSPF协议
RIP是一种分布式,基于距离的路由选择协议。 RIP允许一个路径最多包含15个路由器,也就是距离最大值为16,故RIP适合小型互联网使用;每个路由器每隔一段时间向外广播,每个路由器收到广播后更新自己的路由表,仅和相邻路由器交换信息,不相邻的路由器不交换信息。经过若干次更新后,所有路由器最终会知道到达本自治系统其他路由器的最短距离和下一跳地址,此时称该网络收敛
OSPF:使用分布式的链路状态协议,而不像RIP使用距离向量协议。向本自治系统中所有路由器发送信息。使用洪泛法,向所有相邻路由发送信息,每个相邻路由又再将此信息发给所有相邻路由**。只有当链路状态发生变化时,才使用洪泛法**发生信息;不是定期更新 。
OSPF的区域:
为使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干各更小的范围,叫做区域;使用泛洪法交换链路信息时,仅在一个区域内而不是整个自治系统中,这减小了整个网络上的通信量
外部网关协议EGP
EGP协议的作用:寻找一条能够到达目的网络且比较好的路由,不一定是最佳路由,采用路径向量路由选择协议

VPN
为了实现总部分部的互通,可以使用互联网但是不安全;使用专线很安全但是成本高;所以VPN就是虚拟的专线,实现安全传输访问。主要有IPSEC VPN,PPTP VPN ,MPLS NPN等
核心技术就是隧道技术。报文进行封装,解封装。 以及身份认证技术,以及数据加密 ,数字签名完整性认证等。

NAT

.网络地址转换NAT:
要在路由器上安装NAT软件,装有NAT软件的路由器称为NAT路由器,它至少有一个有效的外部全球IP地址,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换为全球IP地址,才能和互联网连接。目的是解决IP地址不足的问题。 NAPT把专用网内不同的源IP地址,都转换为同样的全球IP地址,但对源主机所采用的TCP端口号,则转换为不同的新的端口号,因此,当NAPT路由器收到从互联网发来的应答时,就可以从IP数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从NAPT转换表中找到正确的目的主机。

TCP,UDP区别和应用场景
区别(连接不连接,可靠不可靠,一对一一对多,面向字节流面向报文)
1、TCP是面向连接的运输层协议;所谓面向连接就是双方传输数据之前,必须先建立一条通道,例如三次握手就是建议通道的一个过程,而四次挥手则是结束销毁通道的一个其中过程。UDP是无连接的传输层协议;
2、TCP提供可靠的传输服务。传送的数据无差错、不丢失、不重复、按序到达;UDP使用尽最大努力交付,不保证可靠交付;/
3、每一条TCP连接只能有两个端点(即两个套接字),只能是点对点的;UDP支持一对一 一对多 多对多的交互通信;/
4、UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留原报文的边界;TCP是面向字节流的,即应用和TCP交互是一次一个数据块,但是TCP把它看成无结构的字节流,不关心一次收到多少数据,TCP根据网络拥塞情况来判断是否需要将数据块拆分,或者等待积累足够多的数据再一起发。正是由于这个特点,灵活发送但是TCP会产生粘包的问题。从TCP首部也能看出来,没有数据部分长度的字段。而UDP是不会产生粘包现象的,它发送的是独立的数据报,UDP首部有数据报长度字段,可以知道读取多少,发送读取的次数一致。
应用场景:TCP适合可靠性高的比如文件传输,UDP适合实时性高的比如视频聊天以及广播通信。
DNS用的是UDP因为快,DHCP也是UDP。(但是DNS也用TCP,如果域名很长超过了UDP最大范围就必须TCP,因为TCP可以拆分面向字节流的,以及DNS主从备份时用TCP)

HTTP、HTTPS、FTP、TELNET、SMTP(简单邮件传输协议)协议基于可靠的TCP协议。DNS、DHCP、TFTP、SNMP(简单网络管理协议)、RIP基于不可靠的UDP协议

TCP,UDP,IP,MAC的报文格式
MAC头部有源MAC地址(6字节,48位,如:08:00:20:0A:8C:6D就是一个MAC地址。IP地址是32位,4字节),目标MAC地址,上层协议类型2字节。中间是数据。尾部还有一个CRC校验4字节。

TCP首部
在这里插入图片描述
首先肯定是端口号不用多说,接下来序号是因为基于字节流,用来以后拼接成正确的报文保证数据不乱序;确认号只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节,保证数据不会丢失重复。TCP规定, 在连接建立后所有传达的报文段都必须把ACK = 1。
首部长度没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
窗口大小此字段用来进行流量控制
校验和对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证,保证数据不错误。

UDP首部
在这里插入图片描述
UDP长度是包含UDP头部和UDP数据的总长度字节。(这一点可以看出TCP只有首部长度字段,基于字节流的,不知道报文商都,没有边界。而UDP是可以通过这个总长度识别报文边界)
校验和是可选项,TCP是必须的
UDP相比TCP简单多了,没有序号确认号,窗口,ACK等关键字来保证可靠传输。

在这里插入图片描述
版本号:IPV4,IPV6
首部长度一般也是20字节
服务类型:时延,吞吐量,可靠性,花费等。一些动态路由协议会根据这个进行决策,比如OSPF
标识用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1。
标志位字段:占3比特。标志一份数据报是否要求分段
段偏移字段:占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。
TTL:每经过一个路由器,其值减1,直到0时该数据报被丢弃。
协议:”指明IP层所封装的上层协议类型
校验和:只对头部进行校验,数据部分不算,这点和TCP,UDP不一样,说明是不可靠的协议。

TCP如何保证可靠性的
首先是三次握手建立连接保证通信双方是可靠的;
首部有序号,保证收到后可以按顺序拼接,并且不重复;
首部有确认号,ACK,保证数据包丢失会重传;(重传有超时重传和快速重传,下面再说)
拥塞控制机制和流量控制机制:流量控制是点对点的,侧重于解决发送和接收方速度不匹配,导致数据包丢失,利用滑动窗口实现,接收方返回的报文有自己接收窗口大小,发送方根据这个大小调整自己的速度;
拥塞控制是针对网络整体的,防止网络过载,数据包丢失重传。方法:
慢开始 (拥塞窗口指数增长,1,2,4,8);拥塞避免(设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长);快重传(当丢包会受到3个重复的确认就进行重传不用等到超时再重传)快恢复(拥塞窗口减为原来的一半不是直接为1)
(扩展知识:基于丢包的控制并不好,随着带宽增大和无线链路的使用,丢包的可能性变大,而加性增乘性减的方式会导致带宽剧烈震荡,吞吐量不高;另外缓存大小增加,延迟高。最佳的应该是在刚出现拥塞就控制,丢包就是连缓冲区都满了,太迟了。比如BBR就是基于瓶颈链路带宽和往返传播时延,二者乘积为最佳控制点,网络充满包,之后将会有数据被缓存在链路的缓冲区中,再到后面就会丢包

超时重传和快速重传
超时重传就是超过RTO时间还没有收到确认就认为丢失需要重传,RTO一般为往返时间RTT。如果超时重发的数据,再次超时的时候,TCP 的策略是超时时间间隔加倍,指数退避。
超时重传最大的问题就是太慢了,需要一直等到超时了才重传,「快速重传」可以解决超时重发的时间等待问题。
快重传要求,接收者如果接收到一个乱序的分组的话,就返回对前一个正确分组的确认应答,当发送方连续收到三个冗余ACK,就会马上快速重传丢失数据,不必等到超时时间再重传。快速重传解决了超时重传的慢速缺点,但是多发了好几个ACK会导致网络更加拥塞。

如何解决粘包问题?(本质原因是TCP是面向字节流的,报文无边界)
表面原因:(naggle,发送接收速度不匹配)
1、发送方采用Nagle算法就可能产生粘包:Nagle是拥塞控制算法,当ftp每次敲击一个字符,就会传一个,此时数据只有1字节,但是TCP/ip首部却达到40字节,浪费资源,造成拥塞。所以nagle算法做了两件事:一是延迟发送小数据,等到上一个确认才发送,二是收集多个小分组,在一个确认到来时一起发送。关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。
2、接收方:如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
解决方法:对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用
TCP_NODELAY选项来关闭算法

接收方没有办法来处理粘包现象,只能将问题交给应用层来处理,解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下几个:首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了;发送端将每个数据包封装为固定长度(不够的可以通过补0填充);可以在数据包之间设置边界,如添加特殊符号。
网络编程如何解决这个问题,当连续发送数据的时候,他们时常会认识tcp会丢包。其实不然,因为当他们使用的缓冲区足够大时,他们有可能会一次接收到两个甚至更多的数据包,而很多人往往会忽视这一点,只解析检查了第一个数据包,而已经接收的其他数据包却被忽略了。这个点可以具体编程实现,作为项目的一个点 https://www.cnblogs.com/wiessharling/p/4230878.html

MTU和MSS分别是什么?
MTU = MSS + TCP Header + IP Header.
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。

MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。
路径MTU发现
数据链路不同,MTU则相异。经过分片之后的IP数据在被重组的时候只能由目标主机进行。路由器虽然做分片但不会进行重组。
分片机制也有它的不足:
路由器的处理负荷加重
随着人们对网络安全的要求提高路由器需要做的其他处理也越来越多
在分片处理中一旦某个分片丢失则会造成整个IP数据报作废
所谓路径MTU是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。进行路径MTU发现就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。
(怎么发现的,发送时IP首部的分片标志位设置为不分片。路由器丢包。由ICMP通知下一次MTU的大小。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。)

IP为什么会分片?有什么缺点?
因为TCP传下来的数据如果大于MTU,IP就会分片(实际上MSS已经限定了最大报文的长度1500-40)。分片可以发生在路由器上或者主机。
缺点 1IP头部占用更多带宽,本来只有一个头部现在有好几个;
2、增加报文丢失概率,降低吞吐率。IP数据重组只会在目标主机上,IP本身并没有可靠的重传机制,靠TCP提供。只有完整才会交给上层,如果分片丢失了,如果上层是UDP,那么真个数据包都会丢失因为不会重传了,如果是TCP,整个报文都要重传,重传的效率变低,网络吞吐率下降了。
如何避免呢?对于UDP,直接在应用层限制包的大小,大小+IP头+TCP头<MTU; 对于TCP,应用层的MSS已经帮你考虑了,可以自动避免的。

三次握手四次挥手考点总结
1、第一次握手:客户端给服务器发送一个 SYN 报文。2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文服务器收到 ACK 报文之后,三次握手建立完成。
这样不好,太简单。
刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后
1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©。此时客户端处于 SYN_Send 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 established 状态。
服务端收到ACK后也处于 established 状态,连接建立。
三次握手作用这也是确保TCP可靠传输的一方面
1、需要三次握手才能确认双方的接收与发送能力是否正常。
2、指定自己的初始化序列号,为后面的可靠传送做准备。三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果ISN是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。ISN主要为了防止历史报文被下一个相同四元组(源ip+port,目标ip+port)的连接接收(主要方面),如果ISN序列号固定为0,按理说四次挥手TIME_WAIT时间历史的报文会消失,但是不一定会四次挥手关闭,比如服务端重启,那么发送方重连,历史报文阻塞,重连后再到,刚好ISN匹配,造成历史报文被接受。如果下一次ISN随机成500,那么0不在500之后范围就会舍弃。

为什么两次握手不行?最后一次ACK没有行不行
防止
失效的连接请求报文段被服务端接收
,从而产生错误。如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源

三次握手可以携带数据吗?(第三次可以,前两次不行)
其实第三次握手的时候,是可以携带数据的。对于第三次的话,此时客户端已经处于 established 状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据页没啥毛病。第三次握手作用就是确保客户端没有失效。
假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

什么是半连接队列?
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
SYN-ACK 重传次数的问题: 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,一定次数后从半连接队列删除。注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s, 2s, 4s, 8s,

DOS攻击就是利用了这些原理。
SYN/ACK Flood攻击:攻击者通常会采用虚拟ip,所以也就意味着服务器永远不可能接收到最终的确认包。这种情况下当服务器未接收到最终ACK数据包的时候,服务端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接。么服务器端将为了维护一个非常大的半连接队列表而消耗非常多的资源。在服务器上用 Netstat-na命令会观察到存在大量的 SYN RECEIVED状态。由于虚拟IP不易追踪

TCP全连接攻击
这种攻击是为了绕过常规防火墙的检查而设计的,一般情况下,常规防火墙大多具备过滤 TearDrop、Land等DOS攻击的能力,但对于正常的TCP连接是放过的,殊不知很多网络服务程序(如:IIS、 Apache等Web服务器)能接受的TCP连接数是有限的,一旦有大量的TCP连接,即便是正常的,也会导致网站访问非常缓慢甚至无法访问,TCP全连接攻击就是通过许多僵尸主机不断地与受害服务器建立大量的TCP连接,直到服务器的内存等资源被耗尽面被拖跨,从而造成拒绝服务,这种攻击的特点是可绕过一般防火墙的防护而达到攻击目的,缺点是需要找很多僵尸主机,并且由于僵尸主机的IP是暴露的,因此此种DDOs攻击方容易被追踪。
TCP刷 Script脚本攻击
,特征是和服务器建立正常的TCP连接,不**断的向脚本程序提交查询、列表等大量耗费数据库资源的调用,**典型的以小博大的攻击方法。一般来说,提交一个GET或POST指令对客户端的耗费和带宽的占用是几乎可以忽略的,而服务器为处理此请求却可能要从上万条记录中去查出某个记录,这种处理过程对资源的耗费是很大的,常见的数据库服务器很少能支持数百个查询指令同时执行,而这对于客户端来说却是轻而易举的,因此攻击者只需通过 Proxy代理向主机服务器大量递交查询指令,只需数分钟就会把服务器资源消耗掉而导致拒绝服务,常见的现象就是网站慢如蜗牛、ASP程序失效、PHP连接数据库失败、数据库主程序占用CPU偏高。这种攻击的特点是可以完全绕过普通的防火墙防护,轻松找一些Poxy代理就可实施攻击,缺点是对付只有静态页面的网站效果会大打折扣,并且有些代理会暴露DDOS攻击者的IP地址。

四次挥手
在这里插入图片描述
假如是客户端先发起关闭请求,则:
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
TIME_WAIT要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功就是 ACK 报文

为什么TIME-WAIT状态必须等待2MSL的时间
MSL指一个片段在网络中最大的存活时间
2MSL当然是2倍 这个存活时间了。
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

TIME-WAIT状态过多会造成什么问题?
高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。一个进程最大可以同时打开的文件描述符是有上限的,ulimit命令可以查到。

time_wait状态如何避免
reuse,rccycle。一个重用,一个减小time_wait时间
调整服务器内核参数:tcp_max_tw_buckets 参数,当 TIME_WAIT 的连接数量超过该参数时,新关闭的连接就不再经历 TIME_WAIT 而直接关闭:tcp_tw_reuse 参数,允许将 TIME_WAIT sockets 重新用于新的 TCP 连接,复用连接。但需要注意,该参数是只用于客户端
首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。
客户端,调整短链接为长链接,HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间;服务器端允许 time_wait 状态的 socket 被重用缩减 time_wait 时间,设置为 1 MSL(即,2 mins)
查看状态为 TIME_WAIT 的 TCP 连接
netstat -tan |grep TIME_WAIT

三次挥手可以吗?(第二次第三次可以合并吗?)
服务器收到客户端的 FIN 报文时,内核会马上回一个 ACK 应答报文, 但是服务端应用程序可能还有数据要发送,所以并不能马上发送 FIN 报文,而是将发送 FIN 报文的控制权交给服务端应用程序:
如果服务端应用程序有数据要发送的话,就发完数据后,才调用关闭连接的函数;如果服务端应用程序没有数据要发送的话,可以直接调用关闭连接的函数,
粗暴关闭 vs 优雅关闭
close 函数,同时 socket 关闭发送方向和读取方向,也就是 socket 不再有发送和接收数据的能力。会直接发送FIN包,再收到消息会回复RST,没有四次挥手了
如果有多进程/多线程共享同一个 socket,如果有一个进程调用了 close 关闭只是让 socket 引用计数 -1,并不会导致 socket 不可用,同时也不会发出 FIN 报文,其他进程还是可以正常读写该 socket,直到引用计数变为 0,才会发出 FIN 报文。

shutdown 函数,可以指定 socket 只关闭发送方向而不关闭读取方向,也就是 socket 不再有发送数据的能力,但是还是具有接收数据的能力。如果有多进程/多线程共享同一个 socket,shutdown 则不管引用计数,直接使得该 socket 不可用,然后发出 FIN 报文,如果有别的进程企图使用该 socket,将会受到影响。
**什么情况会出现三次挥手?**三次挥手不是不可以的。
当被动关闭方(上图的服务端)在 TCP 挥手过程中,「 没有数据要发送」或「开启了 TCP 延迟确认机制(也就是对第一次的syn可以等到服务端数据发完了和fin一起发」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

高级计算机网络总结
几个方向,包括网络协议的改进,网络测量,可编程网络SDN,数据中心网络等。

网络协议改进有:BBR,COPE,QUIC,MPTCP
BBR主要思想是认为在之前的带宽和流量都不大的时候,以丢包为基准的拥塞控制问题不大,但是现在随着带宽增大和无线链路的使用,丢包的可能性变大,而TCP加性增乘性减的方式会导致带宽剧烈震荡,吞吐量不高;另外缓存大小增加,延迟高。最佳的应该是在刚出现拥塞就控制,丢包就是连缓冲区都满了,太迟了。比如BBR就是基于瓶颈链路带宽和往返传播时延,二者乘积为最佳控制点,网络充满包,之后将会有数据被缓存在链路的缓冲区中,再到后面就会丢包。

COPE:通过异或给传输信息编码,压缩传输的信息量,提高网络传输效率;

QUIC(腾讯游戏在用的应用层协议,以及HTTP3也用到了QUIC(为了解决http2队头阻塞(传输层面上)的问题,因为TCP超时重传的机制。)。
QUIC协议是一个加密的(https)、多路复用的、低延时(不需要TCP三次握手以及TLS四次握手、队头阻塞)的传输协议,它被设计用于提高HTTPS的传输效率进而使得快速部署和持续进化成为可能。
用stream id标识连接不再是四元组,可以无缝衔接新连接比如无线换流量上网。

MPTCP允许在一条TCP链路中建立多个子通道.建立连接也是需要三次握手但是多了mp_join选项和哈希的随机数。例如:你的手机同时连接WIFI信号和3G信号的时候,如果WIFI关掉,使用WIFI进行的TCP连接就会断开,而不能有效利用3G网络继续收发数据。而Multipath TCP可以在一条TCP链接中包含多条路径,避免上述问题出现。并且要保证吞吐量和TCP相同,自动选择网络不拥塞的子通道。

网络测量:
最基础的就是Netflow,记录了流的信息(源IP,目的IP,源端口,目的端口,协议)和它们的特征(数据包数量,流开始/结束时间).
elastic:当网络出现问题,例如网络拥塞,扫描和DDoS攻击时,流量特性会急剧变化,从而大大降低测量性能,因此这种情况下的测量尤为重要。这个就是在尽量准确测量的情况下,减少带宽使用不给网络增加负担。主要是采用了heavy part 和ligth part分离大象流和老鼠流。老鼠流是不精准的,当包到达速度很快就丢弃老鼠流。

flowradar:主要用于数据中心的所有流的测量。我们需要覆盖所有的流来抓取这个瞬间的环、黑洞以及交换差错,这些仅仅在网络中的几个流中出现,并且在流量分析上是很精细地信息(例如异常检测)FlowRadar设计的关键是在廉价交换机上有限单数据包处理时间和远程选择器上CPU资源利用中权衡。我们介绍一个编码流程集,这个流程集主需要对每个数据包恒定时间的指挥,因此可以简单地部署在工业界的廉价交换机上。我们然后在远程选择器上解码这些流程集并且提供一个网络范围的分析,针对所有时间和交换机。

数据中心网络
Fat-tree胖树结构。传统网络的带宽是往上层收敛的,所以当流量大就会阻塞。所以要设计不收敛的结构(上行带宽下行带宽相等,一般下行带宽大,也就是下载文件比上传文件快,但是数据中心不是,上传文件很多),如果是单根的树或者多根的树,那么成本很高因为顶层交换机要有足够的带宽以及节点间大规模拷贝的性能瓶颈,因为路径太少会阻塞。
当前,Fat-Tree 是业界普遍认可的实现无阻塞网络的技术。其基本理念是:使用大量低性能的交换机,构建出大规模的无阻塞网络。具体来说,Fat-Tree结构共分为三层:核心层、汇聚层、接入层。

portland:前面的胖树导致会有很多2,3层的交换机,但是这么多的交换机缺少可扩展性,管理困难,通讯不灵活,或缺少对虚拟主机迁移的支持
portland设计就是用一个集中的结构管理器管理拓扑信息,MAC地址分为PMAC和AMAC。ARP都是按照PMAC,在出口交换机执行PMAC到AMAC重写。

(其实通过学习这些本身可以联想到处理问题的思考方式,不仅仅是网络方面,比如docker兴起因为它方便快关于进程相比于虚拟机,而docker一多管理困难,所以有了k8s来统一管理。这和fat-tree利用方便地交换机部署架构以及交换机多了portland来管理这些拓扑信息。(思想是利用成本优势扩展比如分布式就是堆机器,然后再进行管理,比如很多都有master节点)
再比如网络测量里经典的netflow,有了流量变化大的elastic支持流量弹性处理,并且light节省内存,有了数据中心所有流捕获需求的flowradar,利用交换机和cpu联合处理,这些也都是产生新需求,并在内存,成本,cpu,时间资源上做优化完成需求。比如我们为了应对大流量有了redis做缓存,而为了应对缓存穿透,有了布隆过滤器来判断最小程度减轻redis本身的负担,以及token减轻鉴权压力。核心思想是有新需求,把压力转移到外部不给核心系统增加压力)

SDN可编程网络
非可编程网络中,几乎没有方法在物理设备中来验证新的网络协议,比如新的路由协议或者IP协议的替代协议等。这就导致网络研究中很多的新想法没办法进行实验,以致于人们认为网络的基础设施已经“僵化”了。可编程网络研究就致力于解决这个问题。可编程网络需要可编程交换机和路由器。在使用虚拟化技术的情况下可以同时处理多个隔离的实验网络和数据包。一方面,它允许研究人员以统一的方式在高端口密度的异构交换机上进行实验;而另一方面,供应商不需要暴露其交换机的内部工作.

rest API的理解(和http相关的)reatful api就是标准统一,扩展方便的api
rest就是表现层状态转移 Representational State Transfer。
表现层: 一个文本资源可以使用 TEXT 格式表现,也可以使用 HTML、XML、JSON 等格式表现。在 HTTP/1.0 中,Roy Thomas Fielding 为 HTTP Header 设计了 Accept/Content-Type 字段来描述这个 Resource 的 Representational。
State Transfer(状态转移):Resource 作为 C/S 交互的实体,必然存在着状态的变化,然而 HTTP 是一种 Stateless(无状态)的协议(不传输资源状态的描述)。这意味着:Resource 的状态都保存在 Server,而 Client 想要操作某个 Resource(改变其状态)就必须通过某种手段让 Resource 在 Server 上发生状态的 “转移”,而且这种 “转移” 必然是建立在 Resource 的 “表现层” 之上的,例如:创建一个图片资源、删除一个图片资源;启动一个服务,关闭一个服务。故称之为 “表现层状态转移”。
Client 可以使用的手段就是 http的方法(HTTP/0.9 引入 GET,HTTP/1.0 引入 POST、HEAD,HTTP/1.1 引入 PUT 等)。

至此,我们回头再看,REST 讨论的其实是一个:如何将软件和网络两个领域进行交叉融合,继而得到一个功能强、性能好、适宜通信的互联网软件架构的问题。是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件
.(几个重要特征:以资源为基础,表现形式放在头部一种资源可以有多种表现形式,状态转移用统一的方法(get,post等)

openflow协议就是实现openflow交换机顶层下次通信的,交换机就是顶层有个控制器,通过安全通道和下面的交换机交互。交换机流表本身的生成、维护、下发完全由控制器来实现。
sdn就是分成应用层,控制层,设施层。网络的控制面从数据面分离出来且直接可编程,可以实现一系列API(路由,任意访问控制,多播,带宽管理,安全,能耗等)

P4:最大的局限,就是OpenFlow没有做到协议无关,OpenFlow只能依据现有的协议来定义流表项。
P4模型能够支持可编程的包解析器,允许定义新的包头字段;P4模型假设“动作”是使用交换机所支持的协议无关的原语编写而成的。P4提升了网络编程的抽象等级,可以作为控制器和交换机之间的通用接口,在不同的转发设备上可以通用。

(所以sdn的可编程式一步步抽象的这和我们语言,架构设计也很像的)


http://www.niftyadmin.cn/n/264315.html

相关文章

Java版本企业电子招采系统源码——信息数智化招采系统

信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…

“分布式基础概念”全面解析,让你秒懂分布式系统!【一】

前言 在项目中学习这些技术、加深了对其的使用和深层次的理解。以下总结来自谷粒商城项目案例资料 1、什么是微服务&#xff1f; 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自己的进程中&#xff0c;并使用轻量级机…

Qt连接MySQL数据库最详细的教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.直接通过MySQL的驱动加载数据库1&#xff09;所需代码2&#xff09;解决QMYSQL driver not loaded 2.通过ODBC连接MySQL数据库&#xff11;&#xff09;官方解释2…

pytorch-如何加载模型并应用

参考链接 https://blog.csdn.net/ifhuke/article/details/127625901 腾讯词向量 https://www.cnblogs.com/yanqiang/p/13536619.html 腾讯公开词向量数据集 https://ai.tencent.com/ailab/nlp/en/embedding.html 本例中用到的数据已经存到百度网盘了 其他参考 https://blog…

ubuntu22.04安装显卡驱动+cuda+cudnn

ubuntu22.04安装显卡驱动cudacudnn 1. 下载驱动和卸载、禁用自带驱动程序1.1 查看系统显卡型号1.2 从NVIDIA官网下载相应驱动1.3 卸载Ubuntu自带的驱动程序1.4 禁用自带的nouveau nvidia驱动1.5 更新1.6 重启电脑1.7 查看是否将自带的驱动屏蔽 2. 安装显卡驱动2.1 停止lightdm桌…

Python 数据存储 ---->方式

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 数据存储是指在数据加工处理过程中将产生的临时文件或加工结果以某种格式保存。 常用的数据存储格式包括 TXT、Exc…

第三方jar包引入项目,发布到本地和远程仓库

在开发过程中&#xff0c;往往会遇到对接其他公司的系统。然后对接公司会提供API对接方式&#xff0c;就是给一个jar包。我们只需要把jar包引入到项目中直接用即可。本地引用jar的话可以有两种方式。第一种就是本地包引用&#xff0c;如下将包放下工程下&#xff0c;然后maven指…

网络系统管理Linux服务部署 试卷

网络系统管理赛项 - 模块 C : Linux 部署 2 / 14 目 录 一、竞赛说明........................................................4 二、初始化环境......................................................4 (一)默认账号及默认密码 ...............................…