泉州专业网站制作定制,云闪付当前页面设计隐私,中国免费最好用建站cms,辽宁住房建设部网站目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度#xff08;4位#xff09;2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_… 目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度4位2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_WAIT状态 2.5.滑动窗口2.5.1.快重传 2.6.流量控制2.7.拥塞控制2.8.延时应答 3.IP协议解析3.1.报头解析3.2.网段划分3.3.子网掩码3.4.私有和公网IP3.5.路由3.6.IP分片 4.数据链路层4.1.以太网4.2.mac帧格式4.3.mac地址和ip地址4.4.MTU4.5.ARP协议 1.UDP协议解析
1.1.定义
UDP即用户数据报协议是在传输层的一个无连接协议UDP具有简单的报头格式和面向数据报的特点特别适合对延迟敏感但容忍丢包的应用场景如视频流、语音通信和在线游戏。
1.2.UDP报头
UDP的报头格式非常简单
0 - 1516 - 3116位源端口号 (Source Port)16位目标端口号 (Destination Port)16位UDP长度 (Length)16位校验和 (Checksum)
UDP报头共8字节
源端口发送方的端口号标识发送应用程序的进程。对于不需要回复的情况可以设置为0。目标端口接收方的端口号用于确定数据报的接收进程。长度包括UDP报头和数据部分在内的数据报总长度最小为8字节仅包含报头最大为65535字节。校验和用于校验数据在传输过程中是否损坏。如果校验失败此报文直接丢弃。
在目标进程接收到UDP报文后可根据16位UDP长度减去8字节的报头长度找到数据所在的位置。16位标识UDP的长度因此报文限制传输报文大小为必须小于64k。
1.3.特点
无连接UDP不建立连接不维护连接状态数据报的传输是独立的、无序的。这种无连接性降低了传输的复杂度减少了开销。面向数据报UDP以数据报为单位进行传输每个数据报是一个独立的实体不依赖于其他数据报。数据报在发送和接收过程中不会进行任何拆分和重组。每个数据报的长度是明确的这使得UDP特别适合那些需要快速传输并且能容忍部分丢包的场景。无可靠性保证UDP不保证数据的可靠传输数据报可能会丢失、重复或乱序到达。因此应用程序需要自己处理错误检测和恢复机制。较低的传输开销由于UDP报头只有8个字节且不需要维护连接状态因此它比TCP等协议的开销要低适合在网络拥塞较小且对实时性要求较高的应用中使用。
1.4.缓冲区
发送缓冲区UDP不会为数据报建立复杂的缓冲机制因为UDP无序传输和没有重发机制因此UDP没有真正意义上的发送缓冲区当应用程序调用操作系统的发送函数如sendto()时数据直接从应用程序传递到操作系统的网络栈并在合适的时候立即发送到网络上。。接收缓冲区UDP的数据报按到达顺序存储在接收缓冲区中但不保证顺序。如果缓冲区已满新的数据报将被丢弃。因此应用程序需要及时处理接收到的数据防止缓冲区溢出。
2.TCP协议解析
2.1.定义
TCP传输控制协议提供可靠的、面向连接的通信服务。它通过建立连接、数据传输和连接终止的机制确保数据能按顺序、无差错地从一端传送到另一端。
2.2.报头解析 源端口号发送端的端口号。目标端口号接收端的端口号。序列号发送方用来标记数据包顺序。确认号接收方用来确认接收的下一个数据包序号。窗口大小接收方可以容纳的最大字节数控制数据流。校验和用于检测传输中的数据错误。控制标志包括SYN、ACK、FIN等用于控制连接的建立、数据传输、终止等过程。
2.2.1.首部长度4位
TCP报头中有一个4位的数据偏移字段也称为头部长度字段。它的基本单位是4字节所以其能表示TCP报头的最大长度是15 × 4字节 60字节。在分离报头和有效载荷的时候报头长度就是首部长度*4报头之后的部分就是TCP的有效载荷。
2.2.2.窗口大小 当cs基于tcp协议进行通信时他们传送的都是完整的tcp报文但是我们知道缓冲区的大小是有限我们怎么知道对方的缓冲区还有多少来制定我要不要继续发送呢因此在tcp报头中的16位窗口大小就标识了自己接受缓冲区的剩余大小。
2.2.3.确认应答机制
每当一端发送方发送一个数据段时接收方会在收到数据后发送一个确认应答报文ACK告知发送方已经成功接收到数据。发送方可以根据接收方的确认应答判断数据是否正确到达。如果长时间没有收到确认应答发送方会重新发送数据段这种机制保证了即使网络出现丢包数据仍然可以最终传输成功。 TCP报头中的确认序号 在 TCP 报文头部的字段中**确认号Acknowledgment Number**用于实现确认应答。这个字段表示接收方期望接收到的下一个字节的序号。假设发送方发送了一个字节序号为 1000 到 1500 的数据段那么接收方在成功接收到该段数据后确认号将被设置为 1501表示它期待收到序号为 1501 的下一个字节。表示确认序号之前的数据全部都收到了下次从确认序号开始发送
2.2.4.6个标志位
在 TCP 报头中有一个 6 位的标志字段这些标志位用于控制 TCP 连接的状态和数据传输流程。它们分别是URG、ACK、PSH、RST、SYN、FIN。下面将解析他们的含义
ACK确认标志位表示当前数据段中包含一个有效的确认号。如果该位被置为 1则确认号字段有效表明接收方确认已接收到某个序列号之前的所有数据。只有在连接建立之后每个 TCP 数据段都会携带 ACK 位。当 TCP 连接处于建立后的状态时几乎所有的 TCP 报文段都将 ACK 位置为 1。比如在三次握手过程的第二次和第三次握手中ACK 位都为 1。SYN 位用于建立 TCP 连接的初始阶段请求建立连接。表示一个同步序列号的请求用来开始 TCP 的三次握手过程。FIN结束标志位用于优雅地关闭 TCP 连接表示发送方已经完成数据传输并希望终止连接。当某一方想关闭连接时发送 FIN 标志位的报文并等待对方的确认。TCP 连接关闭采用四次挥手其中第一次挥手发送 FIN 报文接收方接收到后会发送一个 ACK 确认然后再发送自己的 FIN 报文等待最终确认。FIN 标志位的设置是 TCP 连接终止的信号它与四次挥手密切相关。PSH推送标志位用于告诉接收方发送方已经发送了一批完整的、需要立即交付给应用程序的数据而不必等待更多数据。通过设置 PSH 位发送方可以保证数据被立即处理。RST复位标志位用于重置连接当 RST 被置为 1 时表示当前连接出现问题需要立即中断或重置连接。URG紧急指针标志位用来表示数据段中存在紧急数据当该位被置为 1 时表明 TCP 报文段中包含需要立即处理的紧急数据接收方应优先处理这些数据。
2.3.超时重传机制
TCP 提供了超时重传机制即当发送方在规定的时间内没有收到接收方的确认应答ACK会假设数据包丢失并重新发送数据段。 工作原理 在 TCP 连接中发送方每发送一个数据段后都会启动一个定时器用于等待接收方的确认应答ACK。如果在指定时间内没有收到 ACKTCP 认为数据段可能在传输过程中丢失发送方将重传该数据段。这就是所谓的超时重传。 那应该在多久的时间没有收到应答就重传呢
在 TCP 协议的实现中Linux 操作系统使用的超时重传时间RTO是根据网络的往返时间RTT动态调整的没有一个固定的超时值。
初始 RTO 值在 Linux 系统中TCP 连接刚开始时由于没有足够的历史数据来估算 RTTRTO 会被设置为一个默认值。这个默认值通常为 1秒1000毫秒。
动态调整随着 TCP 连接的建立和数据传输Linux 内核会根据 RTT 的测量结果不断调整 RTO 的值。一般来说TCP 通过平滑的 RTT 估计值和 RTT 波动量来动态计算 RTO。 如果重传一定次数后tcp会认为网络或对方主机出现问题将会关闭连接。
2.4.三次握手四次挥手 #mermaid-svg-bPJ334K4GpDFosir {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bPJ334K4GpDFosir .error-icon{fill:#552222;}#mermaid-svg-bPJ334K4GpDFosir .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bPJ334K4GpDFosir .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bPJ334K4GpDFosir .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bPJ334K4GpDFosir .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bPJ334K4GpDFosir .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bPJ334K4GpDFosir .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bPJ334K4GpDFosir .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bPJ334K4GpDFosir .marker.cross{stroke:#333333;}#mermaid-svg-bPJ334K4GpDFosir svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bPJ334K4GpDFosir .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bPJ334K4GpDFosir text.actortspan{fill:black;stroke:none;}#mermaid-svg-bPJ334K4GpDFosir .actor-line{stroke:grey;}#mermaid-svg-bPJ334K4GpDFosir .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-bPJ334K4GpDFosir .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-bPJ334K4GpDFosir #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-bPJ334K4GpDFosir .sequenceNumber{fill:white;}#mermaid-svg-bPJ334K4GpDFosir #sequencenumber{fill:#333;}#mermaid-svg-bPJ334K4GpDFosir #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-bPJ334K4GpDFosir .messageText{fill:#333;stroke:#333;}#mermaid-svg-bPJ334K4GpDFosir .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bPJ334K4GpDFosir .labelText,#mermaid-svg-bPJ334K4GpDFosir .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-bPJ334K4GpDFosir .loopText,#mermaid-svg-bPJ334K4GpDFosir .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-bPJ334K4GpDFosir .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bPJ334K4GpDFosir .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-bPJ334K4GpDFosir .noteText,#mermaid-svg-bPJ334K4GpDFosir .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-bPJ334K4GpDFosir .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bPJ334K4GpDFosir .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bPJ334K4GpDFosir .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bPJ334K4GpDFosir .actorPopupMenu{position:absolute;}#mermaid-svg-bPJ334K4GpDFosir .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-bPJ334K4GpDFosir .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bPJ334K4GpDFosir .actor-man circle,#mermaid-svg-bPJ334K4GpDFosir line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-bPJ334K4GpDFosir :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端 服务器 SYN 1 SYN ACK 2 ACK 3 客户端 服务器 三次握手是建立 TCP 连接的过程。它确保了客户端和服务器之间的连接是可靠的并且可以开始传输数据。以下是三次握手的步骤
SYN客户端向服务器发送一个带有 SYN同步标志的包请求建立连接。SYN-ACK服务器接收到 SYN 包后回应一个带有 SYN 和 ACK确认标志的包捎带应答以确认客户端的请求。ACK客户端收到服务器的 SYN-ACK 包后发送一个带有 ACK 标志的包以确认服务器的回应。
其中三次握手也可以看成四次握手在客户端向服务器发送SYN后 服务器将SYN和ACK捎带应答给了客户端。设定为三次握手的原因有可以验证通信双方是否全双工奇数次的握手将握手失败的成本嫁接到客户端不对服务器产生影响。
四次挥手示意图 #mermaid-svg-s24oj4Sr6hQvE51M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-s24oj4Sr6hQvE51M .error-icon{fill:#552222;}#mermaid-svg-s24oj4Sr6hQvE51M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s24oj4Sr6hQvE51M .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-s24oj4Sr6hQvE51M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s24oj4Sr6hQvE51M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s24oj4Sr6hQvE51M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s24oj4Sr6hQvE51M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s24oj4Sr6hQvE51M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s24oj4Sr6hQvE51M .marker.cross{stroke:#333333;}#mermaid-svg-s24oj4Sr6hQvE51M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s24oj4Sr6hQvE51M .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s24oj4Sr6hQvE51M text.actortspan{fill:black;stroke:none;}#mermaid-svg-s24oj4Sr6hQvE51M .actor-line{stroke:grey;}#mermaid-svg-s24oj4Sr6hQvE51M .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-s24oj4Sr6hQvE51M .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-s24oj4Sr6hQvE51M #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-s24oj4Sr6hQvE51M .sequenceNumber{fill:white;}#mermaid-svg-s24oj4Sr6hQvE51M #sequencenumber{fill:#333;}#mermaid-svg-s24oj4Sr6hQvE51M #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-s24oj4Sr6hQvE51M .messageText{fill:#333;stroke:#333;}#mermaid-svg-s24oj4Sr6hQvE51M .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s24oj4Sr6hQvE51M .labelText,#mermaid-svg-s24oj4Sr6hQvE51M .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-s24oj4Sr6hQvE51M .loopText,#mermaid-svg-s24oj4Sr6hQvE51M .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-s24oj4Sr6hQvE51M .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-s24oj4Sr6hQvE51M .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-s24oj4Sr6hQvE51M .noteText,#mermaid-svg-s24oj4Sr6hQvE51M .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-s24oj4Sr6hQvE51M .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s24oj4Sr6hQvE51M .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s24oj4Sr6hQvE51M .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s24oj4Sr6hQvE51M .actorPopupMenu{position:absolute;}#mermaid-svg-s24oj4Sr6hQvE51M .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-s24oj4Sr6hQvE51M .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s24oj4Sr6hQvE51M .actor-man circle,#mermaid-svg-s24oj4Sr6hQvE51M line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-s24oj4Sr6hQvE51M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端 服务器 FIN 1 服务器接收到 FIN 包后进入 FIN_WAIT_1 状态 ACK 2 客户端接收到 ACK 包后进入 FIN_WAIT_2 状态 FIN 3 服务器接收到 FIN 包后进入 TIME_WAIT 状态 ACK 4 客户端接收到 ACK 包后进入 TIME_WAIT 状态 服务器接收到 ACK 包后进入 CLOSED 状态 客户端在 TIME_WAIT 状态保持一段时间后进入 CLOSED 状态 客户端 服务器 四次挥手是断开 TCP 连接的过程。它确保了数据传输完成后连接被正确地关闭。以下是四次挥手的步骤
FIN客户端向服务器发送一个带有 FIN结束标志的包请求断开连接。ACK服务器收到 FIN 包后发送一个 ACK 包以确认客户端的断开请求。FIN服务器准备断开连接时向客户端发送一个带有 FIN 标志的包ACK客户端收到服务器的 FIN 包后发送一个 ACK 包以确认服务器的断开请求。 这个过程确保了双方都正确地关闭了连接避免了数据丢失。
2.4.1.全/半连接队列
在TCP协议中全连接队列和半连接队列是两个重要的队列用于管理TCP连接的建立过程。
半连接队列
作用: 存储还未完成三次握手的连接请求。当一个客户端发起连接请求SYN报文时服务器端的操作系统会将这个连接请求放入半连接队列中。状态: 这个队列主要是用来保存那些已经收到SYN报文、已经发送了SYN-ACK报文但还没有收到ACK报文的连接。长度: 半连接队列的长度是有限的通常由操作系统的配置决定。如果半连接队列满了新的连接请求可能会被拒绝或丢弃。
全连接队列
作用: 当三次握手完成后连接会被移到全连接队列。全连接队列存储所有已经完成握手的连接这些连接现在可以被应用程序接受通常通过 accept() 系统调用。状态: 这个队列的长度也是有限的若全连接队列满了新的连接请求会被拒绝或丢弃直到有空间可用为止。
2.4.2.listen
int listen(int sockfd, int backlog);backlog 参数 意义: backlog 参数控制全连接队列的长度。它告诉操作系统在连接处理期间可以积累多少个已完成三次握手的连接。 配置: 合理配置 backlog 的大小可以影响服务器的并发处理能力。如果 backlog 设置得过小可能会导致合法的连接请求被拒绝影响服务器的响应能力。如果设置得过大则可能浪费系统资源。
2.4.3.TIME_WAIT状态
TIME_WAIT 状态概述
定义: TIME_WAIT 是TCP连接的终止状态之一。它是连接关闭后主动关闭一方进入的状态。作用: TIME_WAIT 状态确保所有的数据包都被正确处理并防止旧的重复数据包在网络上出现。
进入 TIME_WAIT 状态的条件
主动作关闭连接: 当一个TCP连接的主动关闭方通常是客户端发送了一个 FIN 报文并收到对方的 FIN-ACK 报文后该方会进入 TIME_WAIT 状态。协议要求: 根据TCP协议规范主动关闭的一方在关闭连接后必须保持 TIME_WAIT 状态一段时间以确保对方的 FIN 报文被正确接收并处理可能的重传。
TIME_WAIT 状态的持续时间
持续时间: TIME_WAIT 状态通常会持续2倍的MSLMaximum Segment Lifetime。MSL是网络中数据包的最大生存时间通常被设置为2分钟。因此TIME_WAIT 状态的默认持续时间通常为4分钟。目的: 这个时间段的设置是为了确保所有的重传数据包都能被处理避免在网络中出现已关闭连接的数据包。
TIME_WAIT 状态的作用
确保数据完整性: 通过等待确保任何可能的重传的旧数据包被丢弃避免数据混淆。处理重传: 确保所有的 FIN 报文都被处理并确保连接的正常终止。避免端口重用问题: 避免在短时间内重新使用相同的端口号防止新连接与旧连接数据混淆。也就是服务器主动关闭后无法立即重启的原因
使用 setsockopt 实现服务器快速重启
SO_REUSEADDR
作用: 允许服务器在重启时重用地址和端口即使端口仍处于 TIME_WAIT 状态。使用场景: 服务器程序需要快速重启并重新绑定到相同端口时SO_REUSEADDR 选项可以防止端口被占用的问题。
2. SO_REUSEPORT (部分系统支持如Linux)
作用: 允许多个套接字绑定到同一个IP地址和端口。这个选项在多线程或多进程服务器中尤其有用。使用场景: 实现更高的并发能力允许多个进程共享相同的端口。
int optval 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, optval, sizeof(optval));2.5.滑动窗口
什么是 TCP 滑动窗口
TCP 滑动窗口是 TCP 协议中的一种流量控制机制用于调节发送方和接收方之间的数据传输速度以避免网络拥塞或接收方缓冲区溢出。滑动窗口的核心思想是接收方通过告知发送方自己当前的接收能力来动态调整数据传输速率。
滑动窗口的基本原理
1. 发送窗口
发送窗口是发送方维护的一个区域它表示发送方允许发送但尚未确认的最大数据量。发送窗口由三个关键参数组成
已确认的字节已经成功接收到的字节这些字节不再需要重新传输。可发送的字节可以发送的数据量这部分数据已经进入滑动窗口等待发送。未确认的字节已发送但尚未收到确认的数据。
窗口的右端表示发送方可以发送的最大数据量发送方根据接收方的反馈窗口大小和确认号来调整发送窗口的大小。
2. 窗口大小的动态调整
发送方会根据接收方反馈的窗口大小调整自己的发送速率。当接收窗口较大时发送方可以继续发送较多的数据当接收窗口变小或为 0 时发送方必须暂停数据发送直到接收窗口重新增大。至少不能超过接受缓冲区的剩余空间大小。
3. 窗口的滑动
当接收方确认接收到数据并释放缓冲区空间时窗口会向前滑动。其实滑动窗口可以看成用双指针在数组维护的一段空间前指针根据确认序号向右滑动后指针根据确认序号min(接受缓冲区剩余大小有效数据拥塞窗口) 这块我们后面再讲。
|----------------|----------------|----------------|
已确认数据 可发送数据 未确认数据
|----------------|----------------|----------------|-左边界- -滑动窗口- -右边界- 2.5.1.快重传
快速重传是 TCP 的一种优化机制用于在不等待超时的情况下快速检测并重新传输丢失的数据包。它是 TCP 的可靠传输机制和拥塞控制机制中的重要部分。通过快速重传TCP 可以在不依赖超时重传的情况下尽快恢复丢失的数据包进而提高传输效率。
快速重传的背景
在 TCP 协议中发送方发送数据后接收方会对每个数据包进行确认ACK。通常接收方会返回一个确认号ACK表示它已经成功接收到的数据序列号的下一个字节。
然而在网络传输中某些数据包可能会因为网络问题或拥塞而丢失。通常情况下发送方会等待一个超时事件来判断数据包是否丢失超时后会重新发送该数据包。但这可能导致不必要的延迟。为了解决这个问题TCP 引入了快速重传机制。
快速重传的工作机制
三次重复 ACK 的概念
当接收方检测到一个数据包丢失时它不能立即发送该丢失数据包的确认而是会重复发送前一个已经成功接收的 ACK称为“重复确认”。例如
发送方发送了数据包 1、2、3 和 4接收方成功接收到数据包 1但数据包 2 丢失当接收方接收到数据包 3 时它会重复发送数据包 1 的 ACK也就是 ACK 2表明仍然在等待数据包 2。
如果发送方收到连续三个重复的 ACK总共四个相同的 ACK它就会意识到某个数据包可能已经丢失而无需等待超时。此时发送方会立即重新传输丢失的数据包而不是等待超时事件。
工作流程
以发送方发送多个数据包为例展示快速重传的流程
发送方: [发送数据包 1][发送数据包 2][发送数据包 3]...[发送数据包 N]
接收方: [收到数据包 1]...[收到数据包 3][发现数据包 2 丢失] - [发送ACK 1][发送ACK 1][发送ACK 1]
发送方收到三个相同的 ACK 1 后 - [快速重传数据包 2]
2.6.流量控制
流量控制的工作原理
初始传输TCP 连接建立后接收方会通过窗口大小告知发送方自己当前能够接收的数据量。发送方在传输数据时会根据这个窗口大小控制传输速率。动态调整在传输过程中接收方会根据自身的缓冲区情况不断调整接收窗口。当接收方缓冲区逐渐被填满窗口大小会逐渐减小直到降为零发送方就会停止发送数据等待窗口重新打开。暂停与恢复当接收方处理了已接收的数据并释放了缓冲区空间窗口大小会增加发送方收到新的 ACK 后就可以继续发送新的数据包。
接受和发送缓冲区有限根据实际情况控制发送速度的大小就是流量控制。
2.7.拥塞控制
TCP 拥塞控制是 TCP 协议中的一项重要机制用于防止网络因数据流量过大而发生拥塞。
拥塞窗口Congestion Window, cwnd
拥塞控制的核心是拥塞窗口它限制了发送方在未经确认的情况下可以发送的最大数据量。与流量控制中的接收窗口不同拥塞窗口是根据网络状况动态调整的。
拥塞控制的四个阶段
TCP 拥塞控制通常分为以下四个阶段 慢启动TCP 连接初始阶段拥塞窗口从较小的值开始发送方每收到一个 ACK拥塞窗口的大小就会指数级增长直到达到慢启动门限或检测到网络拥塞。 拥塞避免当拥塞窗口达到慢启动门限后TCP 进入拥塞避免阶段此时拥塞窗口的增长速度变为线性增长逐步增加数据发送量直到再次检测到拥塞。 快速重传当发送方收到三个重复的 ACK 时推测某个数据包丢失不等待超时立即重传丢失的数据包尽快恢复传输。 快速恢复在快速重传之后TCP 并不立即进入慢启动阶段而是进入快速恢复通过减少拥塞窗口的大小同时加快数据重传以保持网络性能的稳定。 2.8.延时应答
在TCP协议中为了提高网络效率和减少ACK报文的数量接收方可以使用一种称为“延时应答”的机制。 延时应答是一种优化手段它允许接收方在收到数据包后不立即发送ACK而是等待一段时间通常为40~200毫秒。在这段时间内接收方可能会接收到更多的数据包这样可以将多个ACK合并为一个从而减少ACK的总数量。
当接收方收到一个数据包时它启动一个计时器并暂时不发送ACK。在这段等待时间内接收方可以执行以下操作
接收更多数据如果在计时器时间内接收到更多数据包接收方可以在一个ACK报文中确认所有数据包。合并ACK将ACK与数据包一起发送减少独立的ACK报文数量。计时器到期如果计时器到期且没有新数据需要发送接收方将发送ACK报文确认收到的数据。
3.IP协议解析
3.1.报头解析 版本 (4位)指示IP协议的版本。对于IPv4这个字段的值是4。IP头部长度表示IP头部的长度单位为32位字4字节。最小值为5表示20字节。服务类型 (8位)用于指示数据包的优先级和服务质量。IP数据包的总长度包括头部和数据部分单位为字节。最大值为65535字节。标识符 (16位)唯一标识符用于标识数据包的分片。用于将分片的报文重新组装成完整的报文。标志 (3位)用于指示数据包是否可以分片及是否还有更多的分片分片偏移 (13位)数据包的分片偏移量表示当前分片在原始数据包中的位置。单位为8字节。生存时间 (8位)表示数据包在网络中能够存在的最大跳数。每经过一个路由器该值会减少1当TTL值减至0时数据包将被丢弃。协议 (8位)指示数据包中的有效负载所使用的上层协议。例如TCP协议的值为6UDP协议的值为17。头部校验和 (16位)用于验证IP头部是否有错误。发送端计算并填入这个字段接收端进行校验。源地址 (32位)发送数据包的设备的IP地址。目标地址 (32位)接收数据包的设备的IP地址选项 (0-40字节可选)可选字段用于扩展功能如时间戳、路由记录等。如果没有选项这部分的长度为0。
3.2.网段划分
网络号 : 这是用于识别网络的部分。例如192.168.1.0 是网络号它标识了一个特定的子网。主机号 : 这是用于识别网络内具体设备的部分。例如192.168.1.1 到 192.168.1.254 是可用的主机地址范围。
通过这种划分方式可以在同一网络中管理多个子网并有效利用IP地址资源。
3.3.子网掩码
在计算机网络中子网掩码是一个用于定义IP地址中网络部分和主机部分的工具。它通过与IP地址进行按位与操作来帮助确定网络的范围。 子网掩码的基本概念 子网掩码是一个32位的二进制数通常以点分十进制表示。例如常见的子网掩码有 255.255.255.0。在子网掩码中前面的1表示网络部分后面的0表示主机部分。这个掩码用于将IP地址划分为网络地址和主机地址两个部分。 子网掩码的作用 确定网络地址子网掩码帮助确定一个IP地址所属于的网络。通过与IP地址进行按位与操作可以得到网络地址。 划分子网在较大的网络中子网掩码可以帮助将网络划分为多个子网以提高网络管理的灵活性和安全性。 子网掩码的计算 假设有一个IP地址 192.168.1.10 和子网掩码 255.255.255.0。我们可以按以下步骤计算网络地址
怎么用ip地址和子网掩码计算子网地址范围
1. 确定 IP 地址和子网掩码
假设你有以下 IP 地址和子网掩码
IP 地址: 192.168.1.10子网掩码: 255.255.255.0
2. 将 IP 地址和子网掩码转换为二进制格式 IP 地址: 192.168.1.10 二进制: 11000000.10101000.00000001.00001010 子网掩码: 255.255.255.0 二进制: 11111111.11111111.11111111.00000000
3. 计算网络号
将 IP 地址和子网掩码按位进行与操作AND 操作:
IP 地址: 11000000.10101000.00000001.00001010子网掩码: 11111111.11111111.11111111.00000000网络号: 11000000.10101000.00000001.00000000
转换回十进制网络号是192.168.1.0
4. 计算广播地址
广播地址是将网络号的主机部分即子网掩码中为0的部分全部设置为1。
网络号: 11000000.10101000.00000001.00000000广播地址: 11000000.10101000.00000001.11111111
转换回十进制广播地址是192.168.1.255
5. 计算子网地址范围
子网起始地址网络号 1192.168.1.1子网结束地址广播地址 - 1192.168.1.254
总结
对于 IP 地址 192.168.1.10 和子网掩码 255.255.255.0
网络号: 192.168.1.0广播地址: 192.168.1.255子网地址范围: 从 192.168.1.1 到 192.168.1.254
3.4.私有和公网IP
在网络技术中IP 地址是设备在网络中进行通信的基础。IP 地址可以分为公网 IP 和私有 IP。 公网 IP 地址公网 IP 地址可以被互联网上的任何设备访问
特点 唯一性每个公网 IP 地址在全球范围内是唯一的。可被外部访问公网 IP 地址可以被互联网上的其他设备直接访问。
私有 IP 地址是用于局部网络中的设备识别和通信的地址。私有 IP 地址只能在同一局域网LAN内有效不会在互联网上直接使用。私有 IP 地址通常由网络管理员手动分配或通过 DHCP 自动分配用于家庭、公司或校园网络中的设备。 特点 非唯一性同一私有 IP 地址可以在不同的局域网中重复使用。内部使用私有 IP 地址不可被外部互联网直接访问需要通过网络地址转换NAT技术进行互联网访问。 私有 IP 地址范围 10.0.0.0 到 10.255.255.255/8 子网172.16.0.0 到 172.31.255.255/12 子网192.168.0.0 到 192.168.255.255/16 子网
为了连接到互联网私有 IP 地址的设备需要通过 NAT 技术将内部网络的私有 IP 地址映射到公网 IP 地址。
NAT 技术网络地址转换NAT是一种允许多个设备通过一个公网 IP 地址访问互联网的技术。NAT 设备如路由器在数据包中修改源地址和目标地址从而实现内部网络与互联网之间的通信。
3.5.路由 模拟一下一台主机是怎么访问到公网内的一个服务器的 私有ip是不允许暴露在公网中的所以需要根据路由不断转换。这种私有IP不断准换的过程就是NAT技术为了结局ip地址不足问题
路由表
在路由表中各个字段的解析可以帮助我们更好地理解网络流量的路由方式。以下是路由表的一些关键字段及其解析
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0Destination: 目标网络地址。Gateway: 网关地址数据包应送往的地址。Genmask: 子网掩码用于确定目标地址的网络部分。Flags: 路由标志表明路由的状态和类型。Metric: 路由的优先级值越小优先级越高。Ref: 路由的引用次数。Use: 路由被使用的次数。
3.6.IP分片 上图中16位标识符标识主机发送的报文如果ip报文在网络层被分片了那每一个分片的标识符是相同的。 3位标志
第0位保留位这个位是保留位通常设置为0未来可能用于新的扩展或协议更新。第1位DF位 - Don’t Fragment该位用于指示数据报是否可以被分段。若DF位为1则表示该数据报不能被分段若为0则允许分段。第2位MF位 - More Fragments该位指示数据报是否还有后续的片段。如果MF位为1表示数据报有更多的片段若为0则说明这是最后一个片段或数据报不需要分段。
片偏移 片偏移字段占13位用于指示数据报中某一片段的起始位置。该字段的单位是8字节64位即片偏移值的实际字节位置是该值乘以8。片偏移值该值表示当前片段相对于原始数据报开始的偏移量。例如如果片偏移字段的值为1000则表示该片段在原始数据报中的偏移量为1000 * 8 8000字节。
IP分片是为了应对不同网络传输介质的**最大传输单元MTU**的限制。当一个IP数据报的大小超过网络的MTU时就需要进行分片将数据报切割成多个较小的片段以便传输直到到达目的地后再由接收端进行重组。 即使这样我们依旧不建议分片因为将一个报文分成多片增加丢失的概率。任何一个分片丢失都需要重新发送。
4.数据链路层
数据链路层是计算机网络体系结构中的第二层负责在直接连接的网络节点之间提供可靠的数据传输服务。它的主要任务是将网络层传送的数据封装成帧并在物理网络上进行传输。数据链路层不仅处理数据的封装和解封装还负责错误检测、流量控制以及帧的顺序管理。
4.1.以太网
太网是最广泛使用的局域网LAN技术之一它提供了在局域网内进行数据通信的基础框架。以太网在数据链路层工作通过物理层的介质将数据帧从一个设备传输到另一个设备。
以太网的基本架构
网帧数据在以太网上传输的基本单位包含头部、数据和尾部。MAC地址每个以太网设备都有一个唯一的MAC地址用于标识设备。物理层以太网通过物理介质如双绞线、光纤传输信号。
4.2.mac帧格式
| Preamble | SFD | 目的MAC地址 | 源MAC地址 | 类型/长度 | 数据 | 填充可选 | FCS |
| (7字节) | (1字节) | (6字节) | (6字节) | (2字节) | (46-1500字节) | (0-46字节) | (4字节) |
--------------------------------------------------------------------------------------------------------------------------------------其中源目的MAC地址不必多说类型字段可代码IP报文/ARP/RARP请求应答。帧校验序列FCS, 4字节包含循环冗余校验CRC值用于确保数据帧在传输过程中未发生错误。如果校验不通过帧将被丢弃。
4.3.mac地址和ip地址
在计算机网络中MAC地址和IP地址是两个至关重要的概念它们用于标识网络中的设备但作用、层级和特点有所不同。通过理解它们的差异可以更好地掌握网络的工作原理。
1. MAC地址
全称媒体访问控制地址Media Access Control Address层次数据链路层第二层长度48位二进制通常表示为12位十六进制如00:1A:2B:3C:4D:5E作用标识设备的物理地址。每个网络接口卡NIC在生产时都会被分配一个唯一的MAC地址通常不会发生改变类似设备的“硬件身份证”。使用范围MAC地址仅在局域网内有效用于在同一个网络中进行设备之间的通信。特点唯一性和不可更改性。由于是硬件固化的MAC地址不随设备的网络位置而变化。
2. IP地址
全称互联网协议地址Internet Protocol Address层次网络层第三层长度IPv4为32位如192.168.0.1IPv6为128位如2001:0db8:85a3:0000:0000:8a2e:0370:7334作用标识设备在网络中的逻辑位置通常与网络位置相关联。IP地址可以随着设备接入不同的网络而变化。使用范围全球范围使用。IP地址是设备在网络中的“逻辑地址”用于跨网络传输数据。特点可配置和可变动。设备接入网络时通常由路由器或DHCP服务器分配一个IP地址。 4.4.MTU
MTU解析
MTU是网络中能够传输的最大数据包大小。它指的是一个网络接口或传输媒介所能传输的单个帧的最大字节数超过此值的报文将会被分片处理
1. MTU的工作原理
当主机通过网络发送数据时数据首先会被拆分为多个小的数据块或报文。每个数据块都要通过网络中的某个链路传输而链路上的MTU决定了每个报文的最大大小。如果报文超过了链路的MTU限制则该报文将被分片以适应MTU的要求。
2. 常见MTU值
不同的网络类型有不同的默认MTU值
由于MTU的存在对于较大的IP报文需要分片到达对端后再将小包顺序重组拼装到一起返回给传输层。
使用ifconfig 可以查看mtu
4.5.ARP协议
ARP协议解析
ARP是用于IPv4网络中的一种协议主要作用是在已知IP地址的情况下获取对应设备的MAC地址。ARP协议工作在OSI模型的网络层和数据链路层之间确保数据链路层能够根据IP地址找到设备的物理地址以便在局域网内实现数据通信。
1. ARP的工作原理
当主机需要向同一局域网中的另一个设备发送数据时它需要知道对方的MAC地址但通常只有对方的IP地址。此时ARP协议通过广播机制帮助主机找到目标设备的MAC地址
主机发送ARP请求主机向局域网中广播一个ARP请求帧询问“谁是这个IP地址的拥有者”。目标主机响应ARP请求具有该IP地址的设备接收到广播后向请求方发送ARP响应告知自己的MAC地址。缓存结果主机收到响应后将IP地址和MAC地址的映射关系存储在本地的ARP缓存中避免频繁的ARP查询。
2. ARP报文结构
ARP协议使用特定的格式来封装请求和响应报文ARP报文包含以下字段
** 字段详细解析** 硬件类型 指定使用的链路层协议类型。以太网的硬件类型值为1代表以太网标准。 协议类型 指定要解析的协议类型ARP通常用于IPv4因此其值为0x0800表示IP协议。 硬件地址长度 表示硬件地址MAC地址的长度通常为6字节以太网MAC地址的长度。 协议地址长度 表示协议地址IP地址的长度IPv4地址长度为4字节。 操作码 表示ARP报文的类型有两个常见操作码 1 表示ARP请求ARP Request2 表示ARP响应ARP Reply 发送方MAC地址Sender Hardware Address, 6字节 在ARP请求中指发送请求的设备的MAC地址。在ARP响应中指发送响应设备的MAC地址。 发送方IP地址Sender Protocol Address, 4字节 表示ARP报文的发送方IP地址在请求和响应中都有这个字段。 目标MAC地址Target Hardware Address, 6字节 在ARP请求中这个字段通常为空未填充因为请求方还不知道目标设备的MAC地址。在ARP响应中该字段包含请求方希望获取的目标设备的MAC地址。 目标IP地址Target Protocol Address, 4字节 表示ARP请求或响应报文的目标设备IP地址。请求方希望找到该IP地址对应的MAC地址。
ARP协议工作流程图
以下是ARP协议的工作流程展示了设备如何通过ARP协议将IP地址解析为MAC地址。
-------------------------------
| 主机A有目标IP地址但没有MAC地址 |
-------------------------------|v
-------------------------------
| 主机A在局域网内发送ARP请求 |
| 广播消息“谁拥有此IP地址” |
-------------------------------|v
-------------------------------------------------
| 所有主机收到广播请求检查自己的IP地址是否匹配 |
-------------------------------------------------|v
------------------------------------
| 如果某主机B的IP地址与请求匹配则 |
| 主机B发送ARP响应给主机A |
| 包含自己的MAC地址 |
------------------------------------|v
------------------------------------
| 主机A接收到主机B的ARP响应 |
| 将主机B的IP地址和MAC地址映射 |
| 存储在ARP缓存中 |
------------------------------------|v
------------------------------
| 主机A使用获取的MAC地址 |
| 向主机B发送数据帧 |
------------------------------ arp补充知识 主机的ip和mac地址以及通信过的主机地址都会被临时缓存起来arp只有在缓存失效的时候才会进行可以通过ip和子网掩码的到网络号后广播所有主机获得他的ip和mac地址如果收到多次相同的arp会以最新的为准。