相关概念
OSI参考模型
OSI(开放系统互联连接)参考模型
一级 1: 应用层。 指定用于连接和发送数据的网络界面 。
第2级:指定该层,为各种系统、代码和编码要求等指定数据传输格式;
第3级:会议层:处理用户会议,规范用户之间逻辑联系的建立和终止。
第四级:传输层。管理网络端对端数据交换。
第5级:网络。具体说明如何在网络设备之间传输数据。
六楼的链层。 (b) 将前一个网络层次的数据包合并为一个数据框架,以便进行物理层转移;
第七层是物理层,主要传输二元数据。
网络编程三要素
- IP地址
IP 地址, 包括 IPv4 和 IPv6, 被网络中的计算机用于独特的识别。 IPv4 的形式是小数或二进制表达式, 这是一种比较普遍的表达式类型, 例如 IPv6 是一种很少使用的十六进制表达式 。
- 端口号
端口号是计算机中程序的一个整数数字标记,用于识别它们之间的特性。
该系统使用或保存的港口号为0 1024, 有效港口号为 0 65535, 这意味着当我们定义具体程序的港口号时,使用的是1024至6553535的整数值。
例如,先前学到的 MySQL 港口号为3306;SQLServer港口号为1433;甲骨文港口号为1521。
至关重要的是,这些数据库的对应端口号应储存在深层大脑中,然后在与数据库连接时加以使用。
- 通信协议
一般而言,通信协定是网络通信条例,分为TCP和UDP协定。
第一种:TCP协议
TCP是《传输控制议定书》的缩略语。
转让控制协议(中文)
TCP是连接、可靠、以字节为基础的传输层通信议定书。
例如,电话交谈需要两个参与者连接,以便进行交谈。
数据传输效率低,而且很安全。
第二种:UDP协议
用户数据表协议(UDP)是用户数据表协议的缩略语。
中文名:数据报协议
UDP是连接传输层的协议协议。
例如,案文并不需要缔约方之间建立联系,但数据报告的规模应限于64k。
好处包括:高效、有风险的数据运输以及容易倾倒包裹的能力。
TCP传输层协议
报头
让我们来看看每个组成部分的标志是什么, 以及它是如何运作的。
源港口号和目的地港口号确定数据来自哪个过程和发送到哪个过程。
使用32位数的序列号来跟踪在该端交付的数据数量。
32位确认的序列号:接收端使用确认号通知发送者已成功收到数据。
四位顶级部长: 指定 tcp 标题( 32 位) 中的 4 位字节数 。
保留它,根据定义, 只是以防万一。
6位标志位:
URG: 确定紧急指针的有效性
序号识别有效性
PSH: 用于通知接收应用程序以尽快读取 tcp 缓冲区的数据 。
RST: 重新连接请求: 带有RST标志的报告称为报告副本。
SYN: 连接请求。 包括 SYN 标识的文本被称为同步段落 。
FIN:告诉另一端,此端已准备关闭,带有FIN徽章的报告被称为最后一段。
16位窗口大小:
如果接收终端检查失败,数据被视为有害数据。 在这种情况下的核对总和不仅包括TCP的初始部分,而且还包括TCP的数据部分。
16项应急准则:确定部分数据是否为应急数据。
选项和数据暂时忽略
三次握手
Tcp 需要三种握手连接。
第一次:
客户端 - - > 服务器 此时服务器知道了客户端要建立连接了
SYN=1,seq=x
第二次:
客户端 < - - 服务器 此时客户端知道服务器收到连接请求了
SYN=1,ACK=1,seq=y,ack=x+1
第三次:
客户端 - - > 服务器 此时服务器知道客户端收到了自己的回应
ACK=1,seq=x+1,ack=y+1
SYN 是同步字段的缩写 。 ACK 是一种识别类型 。
相关知识点
- 为什么不用两次?
主要目标是避免被撤销的请求被送回服务器,从而导致错误。
- 什么是半连接队列?
当服务器首次获得客户端的 SYN_RCVD 时, 双方尚未完全建立连接, 服务器将请求在队列中进行连接, 我们称之为半连接队列 。
当然,当三次握手完成时,会有一个全连队列,而那些已经建立连接的人将会被放在全连队列中。如果线路满线,袋子可能会被丢弃。
- SYN-ACK的再传送
这里在补充一点关于SYN-ACK的再传送的问题:
如果没有收到客户确认软件包,服务器将在收到客户确认软件包之前进行第一次再传送,但需在收到客户确认软件包一段时间才能进行第二次再传送。如果再传送的数量超过系统所需的最大再传送次数,则该系统从半连接队列中删除连接信息。
必须指出,每次再传送的等待时间并不总是一样,而且常常是指数上升,例如,间隔由1、2、4和8组成。
- ISN运作了吗?
当结束为连接发送 SYN 时, 它会为连接选择初始序列号。 ISN 会随时间演变 。
因此,每个连接将有一个独特的ISN。ISN可被视为每4分钟加量32位位数的对数。
这一序列号选择的目的是避免在网络中被拖延的集团在稍后阶段被传达,造成该链接的一方作出不正确的解释。
ISN的客户和服务交换是三次握手的主要目的之一,以便互相了解如何在收到数据后按序列号对数据进行汇编。
因为如果ISN是固定的,攻击者可能很容易猜到后来的识别号码,所以ISN是动态生产的。
- 你能通过三次握手发送数据吗?
您可以在第三次握手时传输数据。 但是, 您不能在第一次和第二次握手时携带数据 。
最初握手不被允许泄露数据的主要原因之一是让服务器更容易受到攻击。 到第三次,客户已经处于设定的阶段。
对于客户来说,他已经建立了连接,并意识到服务器的接收和发送能力是正常的,因此能够传输数据没有问题。
四次挥手
四次挥手断开链接
客户端 - - > 服务器 FIN=1,seq=u 客户端进入FIN-WAIT-1
客户端 < - - 服务器 ACK=1,seq=v,ack=u+1 服务端就进入了CLOSE-WAIT
客户端 < - - 服务器 FIN=1,ACK=1,seq=w,ack=u+1 客户端就进入FIN-WAIT-2 服务端就进入了 LAST-ACK
客户端 - - > 服务器 ACK=1,seq=u+1,ack=w+1 客户端就进入 TIME-WAIT (2*MSL) 服务器只要收到了客户端发出的确认,立即进入CLOSED状态
第一波: 客户端发送带有序列号的 FIN 消息。 客户端目前处于 FIN_ WAIT1 状态 。
,即发送连接发布信息(FIN=1,序列号后继=u),停止重新发送数据,自由关闭TCP连接,并进入FIN_WAIT1(终止等待1)状态,寻求服务端的确认。
第二波:服务器收到 FIN 后, 发送了 ACK 信息, 客户的序列号值+1 是 ACK 提交文件的序列号, 表示客户的信息已经收到, 客户处于 CLOSE_WAIT 状态 。
也就是说,当服务结束获得连接释放段落时,它会发出确认段落(ACK=1,确认符号=u+1,序列号后继=v),而服务结束则进入条件CLOSE_WAIT(关闭待定),届时TCP是半封闭的,客户对服务的连接被解除。
第三波: 如果服务器还想断开连接, 它会发送 FIN 消息并提供序列号, 与客户端的第一波相同。 此时, 服务端在 LAST_ ACK 状态 。
如果服务没有向客户发送的数据,它会发送连接发布信息(FIN=1,ACK=1,序列号后继w,确认符号=u+1),并在客户确认之前进入 LAST_ACK(最后确认)状态。
第四波:客户收到FIN后,发送ACK信息作为答复,并使用服务序列号值+1作为其ACK提交文件的序列号,此时客户处于Time_WAIT状态。它花了一段时间才确保服务供应商在进入CLOSED状态之前收到自己的ACK提交文件,服务供应商收到ACK提交文件并处于CLOSED状态。这就是说,当客户从服务获得连接释放时,即发送确认信息(ACK=1, 后继=u+1, ack=w+1),客户进入Time_WAIT(时间等待)。 TCP当时没有发布,而且花了时间等待计时器在客户进入CLOSED状态之前设定2MSL。 收到FIN仅意味着没有这方面的数据流。 成功关闭和进入Time_WAIT是正常的,服务器通常进行被动关闭,没有进入Time_WAIT状态。
相关知识点
- 为什么要挥手四次?
这是因为SYN+ACK报告可在服务收到客户SYN连接请求后直接发布。使用SYN+ACK报告进行回复,而SYN报告用于同步。
然而,当连接终止时,客户收到FIN的讯息时,SOCKET可能不会立即关闭,只允许回应一个ACK的讯息,并通知客户“收到你发送的FIN的讯息”。
只有在我提交了所有客户的报告之后,我才能发送FIN的讯息,但不会一起发送,因此需要四波波。
- 为什么前一位顾客还在等2 -MSL?
首先,客户端提供的上一条 ACK 信息可以被保证发送到服务器, 因为 ACK 信息可能会丢失, 从服务器的角度看, FIN+ACK 信息请求已被删除, 客户端尚未回复我 。 我发送的请求没有收到, 因此服务器会再次发送 。 如果客户在 2MSL 时间段内收到 重新发送的信息, 它将会响应并恢复 2MSL 时间器 。 Time_ WAIT 状态同样是 2MSL 等待状态 。
其次,为了避免在这方面列入“断绝连接请求”,类似于“三握手”的参考。 一旦客户已发送最后确认信息, 连接长度所生成的所有信息将在此2MSL时间从网络中删除。 这样, 旧连接请求将不出现在新连接中 。
- 2MSL等待状态
MSL:
每一项独特的TCP成绩都必须为MSL(最大安全寿命)选择报告的最大生存时间,这是在放弃之前任何报告期间在网络中的时间最长的,因为TCP输入是通过因特网使用IP数据传送的,而IP数据报告含有限制其寿命的TTL字段。
前提是,当TCP进行主动关闭并交付确定MSL值的最后一次ACK时,该连接必须保持时间-WAIT状态,为MSL期限的2倍。
这样, TCP 就可以在最后的ACK 丢失时重现它( 另一端被超时, 最后一个 FIN 重新发布 ) 。
2MSL 等待的另一个后果是,在 2MSL 等待期间, 此 TCP 连接可用, 但描述连接的插件( 客户 IP 地址和端口号、 服务器 IP 地址和端口号) 无法再使用。 连接只能在 2MSL 完成后使用 。
- 如果连接已经确定,但客户有问题呢?
TCP有一个实时计时器,很明显,如果客户失败了,服务器就不能永远等待,浪费资源。 服务器每次收到客户请求,通常在两个小时后,服务器都会重置计时器,如果2小时后没有收到客户的数据,服务器就会发出检测信息,每75分钟发送一次。
TCP 相对于 UDP
由于TCP是一种以字节为基础的传输层协议,TCP方案是以IO为基础的。
客户端:
- 创建 Socket 对象并提供服务器- 终端应用程序的端口号以及服务器- 终端主机的 IP 地址 。
- 要获取字节输出流, 请使用套接字对象的 GetOutStream () 函数 。
- 在字节输出流上写入( byte[ ] buf) 或写入( int b) 以将所提供的数据传输到服务器 。
- 记得关闭流。
服务器端:
五. 创建一个服务器套件对象,并指定应用程序的端口号,该端口号必须与客户端提供的端口号相同。
六. ServerSocket 对象的接受() 功能监测客户端的请求,并将值返回到 Socket 对象 。
七. 要获取字节输入流, 请在 Socket 对象上使用 GetInputstream () 函数 。
八. 为获取数据,使用流体的读(字节[ buff)或读()方法。
9. 记得关闭流。
UDP编程
UDP使用数据报告进行数据传输;客户端和服务器端之间没有分离;发射机和接收器都不得被错误地激活;然而,数据可能会丢失。 发送的文字有字数限制, 大小必须限制在64k。
发送方:
- 创建有或没有指定应用程序端口号的“数据组套件”对象。
- 准备需要发送的数据
- 创建数据组包件对象, 用于封装交付的数据, 并要求提供文本 。 我应发送多少? 端口号和四个参数被传送到何处和向谁传送 。
- 要发送数据, 请引用“ 数据组” 对象的 Send () 函数 。
- 记得关闭流。
接收方:
- 通过提供收件人的端口号来创建数据套件对象,必须提供端口号。
- 要接收发件人的数据,将创建一个字节类型数组。
- 创建数据组包件对象,并准备接收数据。
- DatagramSocket 对象接收() 函数用于接收数据 。
- 将字节类型阵列数据转换为字符串类型数据,并使用字符串类型创建技术显示数据。
- 记得关闭流。
TCP 相对于 UDP
无法轻易和完全比较TCP和UDP的利弊。
在文件传输、关键状态更新等情况中,TCP被用于可靠的通信。
UDP用于需要高速传输和实时需求的通信领域。
例如,早期的ZQ、视频传输等等。 UDP也可以用于广播。
为什么TCP这么难?
因为我们需要保持可依赖性,同时尽可能改进我们的业绩。
保证可靠性的机制
- 校验和
- 序列号(按序到达)
- 确认应答
- 超时重传
- 连接管理
- 流量控制
- 拥塞控制
反应机制确认(ACK)
TCP为每个字节指定了一个序号。
每个ACK都包含一个匹配的确认序列号 向发件人表明我收到的数据 以及下次从哪开始
例如,如果客户向服务器交付了1005字节的数据,服务器将确认序列号退回客户为1003,表明服务器只收到1002字节。
1003,1004和1005没有收到。
客户此时将从1003重新发行。
超时重传机制
一旦主机 A 将数据传送到 B, 数据可能由于网络堵塞等原因无法到达主机 B 。 如果主机 A 在一定的时间内没有得到 B 的确认回复, 数据将重新发布 。 然而, 主机 A 可能已经丢失了 ACK, 直到校验 。
在这种情况下,主机B收到大量重复数据,因此,TCP协议必须确定哪些软件包是重复的,并删除重复数据。
使用上面给出的序列号, 这一次很容易变得更重。
如何确定超时时间? 动态计算Linux 500ms 2500ms 4TCP认为,终端主机的网络异常或异常在500米后不得不逐渐以指数形式取消连接,并累计为一定数量的再传送。
流量控制
TCP允许发件人的速度由接收端的处理能力决定。
在TCP的第一部分,接收器指定了在“窗口大小”字段中可能接收的缓冲的大小。
通知发件人;
窗口大小越大,网络输送量越大。
当接收器意识到其缓冲剂已接近满载时,它会缩小窗口的大小,并向发送者发出通知。
当发送者被告知此窗口的大小时, 它会放慢自己的发送速度 。
如果接收方完全满载,窗口将被重置为零。
发送者此时不再发送数据,但需要定期发送窗口检测数据部分,使接收者能够调整窗口大小并与发送者通信。
那么,接收器如何将窗口的大小告知发件人?
我们的 TCP 前端有一个16位数的窗口大小字段, 持有窗口大小信息 。
因此,TCP窗口限为65536字节。65536字节是什么?
实际上,TCP的前40字节含有一个窗口扩展因子M, 实际窗口大小是窗口字段的值移到 M-bit 左侧( 向左移动一等于2乘以2) 。
拥塞控制
即使你一开始发送大量迪纳 也可能有些问题
因此,TCP包括一个缓慢的启动机制,它能够首先发送少量数据,以探索路线,确定目前的网络拥堵程度,然后决定传输数据的速度。
这是对压缩窗口概念的介绍。
传输开始时,它指定压缩窗口大小为1;
当你收到ACK的回答时,你将它插进窗口。
在发送数据包的同时,将压缩窗口的大小与接收器对主机的反馈进行比较,并使用较小的数字作为真正的发送窗口。
"慢起步"就是那个 缓慢起步 但它发展得很快
这被称为缓慢启动的门槛值,因为当压缩窗口超过它时,它不再成倍增长,而是线性增长。
最后,TCP同意尽快相互发送数据,同时避免妥协,以免给网络带来太大的压力。
提高性能的机制
- 滑动窗口
- 匆忙中再传送( 包裹丢失 )
- 延迟应答
- 捎带应答
- 滑动窗口
因此,能否一次传输不止一个数据段?
无需验证即可交付数据的最大值称为窗口大小。
在交付前四段之前,不必等待任何 " ACK " 。
窗口在得到最初的 ACK 确认回答后往后移 并继续传输第5678段的数据..
此窗口被称为幻灯片窗口, 因为它向后移动 。
要将这个幻灯片窗口保留在操作系统中,必须创建一个传输数据的缓冲器,以记录哪些数据尚未解答。
只有在 " ACK " 核实数据反应之前,数据反应才能撤出缓冲区。
如果有滴水,我们如何重新传送袋子?
第一,收到了包裹,但是对ACK的反应丢失了。
在这种情况下,失去部分ACK并不是一个大问题, 因为验证通过后续ACK收到的数据包也是可行的。
2, 数据包丢失
当部分信息丢失时,发送者会像提醒发送者一样得到1001个这样的背包:“我要1001个”。
如果发件人主机收到同一“ 1001” 三次的相同响应, 数据 1001 - 200 将重新发送 。
接收器此时收到1001, 后回回至ACK 7001。
由于以前曾收到2001-700个接收端,因此分配给接收端操作系统的接收端缓冲区。
- 闪光中再传输。该方法被称为“高速再使用控制”(或“快速再传输”)。
- 延迟应答
延迟答复的原因是要归还最大的可行窗口规模。
数量有限:对每个N包装作出反应。
时间限制:在最大延迟后仅作一次答复。
视操作系统而定,Ns的实际数量和最长延迟期各不相同。
正常N需要2秒,而最大的延迟是200毫秒。
- 搭便车吧,ACK。
面向字节流
在核心内部, 创建一个 TCP 插座, 同时建立发送缓冲和接收缓冲 。
拨打写字时,数据最初写在发送缓冲地带。
如果提供的字节太大,它们将分布在许多TCP数据包中。
如果传送的字节数量不足,它们将在缓冲区等待,等待到缓冲区满员,或稍后送交。
收到数据后,数据从网卡驱动器到达接收缓冲区内内核。
程序然后可以利用呼叫读取功能从接收缓冲区获取数据。
另一方面,TCP连接,包括传输和接收缓冲区,导致接收者人数增加。
因此,在这方面,你可以读和写数据,它被称为全时工作。
由于缓冲区,没有要求与TCP方案的阅读和写作相匹配。
例如:
写入 100 字节数据; 您可以使用一次写入来写入 100 字节, 或者一次拨100 字节来写一个字节 。
当你阅读 100 字节时, 您不必担心您在写作时写什么; 您可以同时读100 字节, 100 字节一次读100 字节, 100 字节 。
粘包问题
首先,在粘糊糊的问题上,“包装”是指应用层中的数据包。
TCP 协议页眉中没有“ 报告长度” 字段, 就像 UDP 一样 。
尽管如此,还是有一个序列号领域。
TCP是从传输角度传递的信息,按序列号插入缓冲区序号。
从应用层的角度来看,你看到的只是一串字节。
因此,应用程序将看到这串字节, 并不知道它是从何处开始的, 或者它是从何处结束的, 作为完整的层数据集 。
目前数据之间没有边框, 并且有一个粘糊糊的袋子问题 。
那么,我们如何防止粘糊糊的袋子问题?
最后,这是一个术语, 明确区分两个袋子。
对于定长的包
- 确保每次阅读的大小相同。
例如,请求书结构按大小固定,从缓冲区开始按(请求)的大小逐个阅读。
对于变长的包
- 你可能同意包件头部的字段, 然后你就会知道它何时完成。
包件之间的明确分离也可以用作边界。 (只要分隔符与文本不冲突,应用层协议由程序员决定。 )
TCP 异常情况
进程已终止: 已被终止的流程将发布文档配置文件, 但仍可以发送 FIN 。 与其它关闭程序相同 。
重新启动机器和终止程序是一样的
机器停用/ 网络线 : 收件人认为连接仍然有效, 接收者写下来后, 接收者发现连接不再有效, 接收者被重置 。 即使没有写入, TCP 也把自己变成了实时定时器, 定期检查对方是否还在那里 。 如果他不在场, 他将会断开连接 。
在应用层面还有某些议定书以及探测技术。
例如,在长时间的HTTP连接中,定期观察彼此的地位。
例如,尝试在失败时定期重新连接。
相关知识点
定时器
超时重传定时器
保活定时器
时间计时器时间(_WAIT)
- 基于 TCP 的图层协议
HTTP HTTPS SSH Telnet FTP SMTP
- SYN攻击是什么?
服务器的资源是在第二次握手期间分配的,但客户的资源被分配用于完成三次握手,使服务器易受SYN洪水的影响。
SYN攻击包括客户在短时间内伪造大量不存在的IP地址,并将SYN软件包发送给服务器,服务器对确认软件包作出反应,等待客户确认。
由于源地址不存在,服务器必须重新发送至时限,这些伪造的SYN软件包将长期填充断开的队列,导致SYN的常规请求因全队列而被拒绝,造成网络拥堵,甚至系统瘫痪。
SYN攻击相当容易识别,当您注意到服务器上的半连接状态的符号编号时,特别是当原始IP地址是随机的时,您可以推断这是SYN攻击。SYN攻击可以通过使用系统自己的网络状态指令在Linux/Unix上探测到。
netstat -n -p TCP | grep SYN_RECV
以下是流行的SYN攻击方法:
- 缩短超时(SYN超时)
- 增加最大半连接数
- 过滤网关防护
- SYN饼干技术
netstat
净数据产出分为两节。
- 活动中的互联网连接有源 TCP 连接, 其中“ recv- Q” 和“ Send- Q” 分别指接收和发送队列。 这些值通常应为零。 如果没有, 软件包会堆叠在队列中, 仅在少数情况下可以看到 。
- 活动 UNIX 域组合包括一个源 Unix 域集接口(类似于网络集,但专门用于机载通信,可翻倍)。
列名解释:
- Proto: 显示用于连接的协议 。
- 引用: 与此界面集相关的进程编号 。
- 类型: 显示接口类型 。
- 状态: 显示设置接口当前状态 。
- 路径: 连接到接口的其他进程所使用的路径的名称 。
共同Netstat参数
- -a(全部) 显示所有选项; 默认不显示与 Listen 相关的选项 。
- - t( tcp) 显示仅与 tcp 相关的选项 。
- -u(udp) 只显示合适的udp选项。
- - 拒绝透露别名,而是显示数字转换成数字的整个过程。
- 在听, - 我只是显示服务状态 。
- -p 显示用于创建适当链接的应用程序名称。
- -r 显示路线信息和路径图。
- -e 显示扩展信息,例如 uid 等。
- - S,按照协议计数
- -c 在预设间隔内运行 Netstat 命令。
只有监听国和监听国在a或l中显示。
使用了与网络状态有关的指令。
- # netstat -a - list - all -ports
- #netstat-at 显示所有 TCP 端口的清单。
- #netstat-au 显示所有 udp 端口的列表 。
- # netstat- l 显示只显示收听器端口
- #netstat-lt只显示监听 tcp 端口。
- 只提到收听者港#netstat-lu。
- #netstat-lx 显示当前监听的所有 UNIX 端口列表 。
- #netstat-s显示所有港口的统计数据。
- #netstat-st 或 -su 显示有关 TCP 或 UDP 端口的统计信息
- #netstat-p 在输出中显示 PID 和进程名称。
- 不在 Netstat 输出( 主机、 端口或用户) 中显示主机、 端口或用户名 。
持续输出的 Netstat 信息 # netstat-c
- 以净数据-基准数表示的 ':80'
- 见与服务港口(前20个)相连的多数IP地址。
#netstat -nat | grep “10.1.62.23:443” |awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -20
- TCP各种状态列表
#netstat -nat |awk ‘{print $6}’
统计数量
#netstat -nat |awk ‘{print $6}’|sort|uniq -c
排序
#netstat -nat |awk ‘{printKaTeX parse error: Expected 'EOF', got '}' at position 2: 6}̲'|sort|uniq -c|…NF]} END {for(a in S) print a, S[a]}’
- 直接计数的 tcp 听众人数
#netstat -ant | wc -l
本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/13160.html。