文章目录
- 前言
- OSI7层网络模型
- TCP/IP四层模型
- 三、协议
- 四、常见协议
- UDP协议
- TCP协议
- IP协议
- 以太网帧协议
- ARP协议
- 封装
- 分用
- 五、UDP通信流程
- TCP通信过程
- 七、TCP三次握手
- 八、滑动窗口
- 九、四次挥手
- TCP如何提供可靠的数据传输
- TCP的粘附和拆卸
- TCP状态转换
- 十三、半关闭
- 十四、端口复用
- 总结
前言
让我们谈谈网络模型:OSI的七层网络模型,TCP/IP的四层模型,通用协议。
OSI7层网络模型
OSI七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联。该参考模型是国际标准化组织(ISO)开发的计算机和通信系统相互连接的标准系统。它通常被称为OSI参考模型或七层模型。这是一个抽象的七层模型,不仅包括一系列抽象的术语或概念,也包括具体的协议。

- 物理层:主要定义物理设备标准,例如,网络线的接口类型,光纤的接口类型,各种传输介质的传输速率等。它的主要功能是传输位流(即从一个到零的传输到强电流和弱电流)。到达目的地后,转换为1, 0,这就是我们经常所说的数值和数值转换。这个数据层叫做位。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。定义了如何让格式化数据以帧为单位进行传输,以及如何控制对物理介质的访问。将比特组合成字节进而组合成帧,用MAC地址访问介质。
- 网络层:进行逻辑地址寻址,在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
- 传输层:定义一些传输数据的协议和端口号(例如WW端口80),例如:TCP(传输控制协议),传输效率低,可靠性强,运输的可靠性要求高,数据量大的数据),UDP(用户数据报告协议,与TCP特性相反,由于传输可靠性要求低,数据量小的数据,例如,QQ聊天数据以这种方式传输。它主要是从下层接收的数据进行分割和传输,到达目标地址后重新组织.这个数据层通常被称为分段。
- 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求。
- 表示层:数据的表示、安全、压缩。主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等)。
- 应用程序层:网络服务与终端用户之间的接口,提供网络服务给用户应用程序(例如电子邮件、文件传输和终端仿真)。
记忆顺口溜:物、数、网、传、会、表、应。
TCP/IP四层模型
今日在互联网中使用的主要协议家族是TCP/IP协议家族。这是一个层级、多协议的通信系统。TCP/IP协议家族是一个四级协议系统,从底层到顶层分别是数据链层、网络层、传输层和应用层。每个层都有不同的功能,通过一些协议,上层协议使用下层协议提供的服务。

TCP/IP协议在某种程度上指的是OSI的架构。OSI模型有七层,从底层到顶层分别是物理层、数据链层、网络层、传输层、对话层、表示层和应用层。但这显然有点复杂,在TCP/IP协议中,它们被简化为四个层次。
(1)应用层、表示层、会话层三个层次提供的服务相差不是很大,在TCP/IP协议中,它们被合并为应用层一个层次。
(2)由于传输层和网络层在网络协议中非常重要,因此它们被视为TCP/IP协议中的两个独立层。
(三)由于数据链层的内容与物理层相似,因此在TCP/IP协议中,它们被分配到网络接口层中的一层。只有四层架构的TCP/IP协议,与有七层体系结构的 OSI 相比要简单了不少,也正是这样,TCP/IP协议在实际应用上更有效,成本更低。
四层介绍
- 应用程序层:应用程序层是TCP/IP协议的第一层,直接向应用程序进程提供服务。
(一)在不同类型的应用程序中,它们将根据需要使用不同的协议来实现不同的应用程序层,邮件传输应用使用SMTP协议,通用网络应用使用HTTP协议,远程登录服务应用使用TELNET协议。
(2)应用程序层也可以加密、解密和格式化数据。
(3)应用程序层可以建立或切断与其他节点的连接,从而足够节省网络资源。
- 传输层:作为 TCP/IP 协议的第二层,运输层在整个 TCP/IP 协议中起到了中流砥柱的作用。且在运输层中, TCP 和 UDP 也同样起到了中流砥柱的作用。
- 网络层:网络层在 TCP/IP 协议中的位于第三层。在 TCP/IP 协议中网络层可以进行网络连接的建立和终止以及 IP 地址的寻找等功能。
- 网络接口层:在TCP/IP协议中,网络接口层位于第四层。因为网络接口层将物理层与数据链接层结合起来,网络接口层是传输数据的物理介质,它还可以为网络层提供准确的线。(网络、网络卡、MAC地址)
三、协议
网络协议(英语:Network protocol)是通信计算机双方必须共同遵守的一系列协议,包括如何建立联系、如何相互识别等。 只有通过遵守这一协议,计算机才能互相通信。
为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。
协议通常在多个层中定义。该层定义旨在确保一个协议层的更改不会影响其他协议层。
四、常见协议
- 应用层常见的协议有:FTP协议(File Transfer Protocol 文件传输协议)、HTTP协议(Hyper Text Transfer Protocol 超文本传输协议)、NFS(Network File System 网络文件系统)。
- 传输层常见协议有:TCP协议(Transmission Control Protocol 传输控制协议)、UDP协议(User Datagram Protocol 用户数据报协议)。
- 网络层常见协议有:IP 协议(Internet Protocol 因特网互联协议)、ICMP 协议(Internet Control Message Protocol 因特网控制报文协议)、IGMP 协议(Internet Group Management Protocol 因特网组管理协议)。
- 网络接口层常见协议有:ARP协议(Address Resolution Protocol 地址解析协议)、RARP协议(Reverse Address Resolution Protocol 反向地址解析协议)。
UDP协议

- 源端口数:发送端口数
- 目标港口号码:接收港口号码
- 长度:UDP用户数据报告的长度,至少有8个(仅第一部分)
- 检查和:检测UDP用户数据报告是否是传输中的错误,并排除任何错误
TCP协议

- 源端口数:发送端口数
- 目标港口号码:接收港口号码
- 序列数:本段数据的第一个字母的序列数
- 确认序列:期望接收另一方下一个消息段的第一个数据字段的序列
- 首部长度(数据偏移):TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即首部长度。单位:32位,即以 4 字节为计算单位
- 保留:6个地点,预留未来使用,目前应为0个
- 紧急报告:第1位指示紧急标记字段有效,告诉系统该报告字段有紧急数据,并应尽快传送
- 确认ACK:确认字段仅当ACK = 1时有效,并且TCP指定在建立连接后发送的所有消息必须将ACK置于1
- 发送PSH:当两个应用程序进程相互通信时,有时,一个端的申请过程希望在输入订单后立即得到另一个端的响应。在这种情况下,TCP可以使用推力操作,这时,发送者TCP设置PSH1,并立即创建一个发送消息的字段,接收者收到PSH=1的声明,尽快向接收申请程序提交(即转递);不再等待整个缓存被填满并向上运送
- 删除RTT:删除相应的TCP连接,这意味着要求另一方重新建立连接。
- 同步SYN:只有在TCP连接由三个握手建立时才有效。当SYN = 1和ACK = 0时,这表明这是一个连接请求声明,如果另一方同意建立联系,然后SYN = 1 和 ACK = 1 应在相应的声明中使用。因此,SYN设置1来表示这是连接请求或连接接受消息
- 完成 FIN:释放连接。 当 FIN = 1 时,它表示此部分消息的发送者的数据已经发送。
求释放运输连接
- 窗口:指发送条文的一方的接收窗口(而不是其本身的发送窗口)
- 视察和:视察和现场视察包括数据的第一部分和第二部分。 在计算视察和数据的第二部分时,必须添加一个12字节的伪头
- 紧急标记只有当URG = 1时才具有意义。 它表示本条紧急数据中的字节数(紧急数据的末尾)
是正常数据),即表示消息中紧急数据的末端位置。请注意,即使窗口为零时,也可以发送紧急号码
据
- 选项:可变长度,最大40字节长度,在没有选项的情况下,TCP首部是20字节IP协议
IP协议

- 版本:IP 协议的版本。通信双方使用过的 IP 协议的版本必须一致,目前最广泛使用的 IP 协议版本号为 4(即IPv4)
- 总部:32个单位(4字节)
- 服务类型:一般不适用,值0
- 总长度:将数据添加到第一个部分的总长度,以字节单位
- 标识(identification):IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段
- 旗帜: 目前只有两个有意义的旗帜。标记领域最低点是MF。MF = 1 表示,数据报告背后有一个“部分”。MF = 0 表示这是最后几个数据表。标记字段中的一个标记为DF,这就意味着你不能把东西分开。只有 DF = 0 时才允许
- 片偏移:指出较长的分组在分片后,某片在源分组中的相对位置,也就是说,相对于用户数据段的起点,该片从何处开始。片偏移以 8 字节为偏移单位。
- 生存时间:TTL,表明是数据报在网络中的寿命,即为“跳数限制”,由发出数据报的源点设置这个字段。路由器在转发数据之前就把 TTL 值减一,当 TTL 值减为零时,就丢弃这个数据报。
默认64或者128。
- 协议:指定该数据消息传输数据时使用哪些协议,以便目标主机的IP层知道该数据部分应该分配哪些处理过程,通用ICMP(1),IGMP(2),TCP(6),UDP(17),IPv6(41)
- 第一次核查和: 只核查数据报告的第一个部分, 不包括数据部分.
- 来源地址:发送者IP地址
- 目标地址:接收者IP地址
以太网帧协议
类型:0x800为IP,0x806为ARP,0x835为RARP
ARP协议
根据IP地址找到MAC地址。

- 硬件类型:显示 MAC地址
- 协议类型:0x800显示IP地址
- 硬件地址长度:6
- 协议地址长度:4
- 操作:1 表示 ARP 请求,2 表示 ARP 应答,3 表示 RARP 请求,4 表示 RARP 应答
ARP协议用于通过广播搜索与IP地址相符的MAC地址。

封装
上层协议如何使用下层协议提供的服务?其实这是通过封装(encapsulation)实现的。在应用程序数据发送到物理网络之前,它将通过协议堆栈从上到下。每个层协议将添加自己的标题信息(有时包括尾部信息)在数据的顶部,以实现该层的功能,这个过程叫做包装。

分用
当帧到达目标主机时,它将沿协议堆栈向上和向下传递。每个层协议在负责层的框架中处理头部数据,以获取所需的信息,最后, 处理的帧被传递到目标应用程序.这个过程称为分用(demultiplexing)。分配是通过依赖头条信息中的类型字段实现的.

包装和分离的综合过程

五、UDP通信流程

TCP通信过程
UDP: 用户数据报告协议, 不连接, 单播, 多播, 广播, 数据报告, 不可靠
TCP:传输控制协议,面向连接,可靠,基于字节,只支持单通道传输
TCP的通信流程分为两个部分,如下所示,
所需要的 socket 套接字函数参考第三篇博客
。
服务器端(连接角色的被动接受)
- 创建一个监视接口;
- 监视:监视客户连接
- 插座:这个插座实际上是一个文件描述器
- 将该监视文件描述符绑定到本地IP和端口(IP和端口是服务器地址信息);
- 设置监视,监视局开始工作;
- 当客户端启动连接时, блок等待,关闭块,接受连接,并接收一个数据包(fd)来与客户端进行通信;
- 通信;
- 通信终止,连接被切断。
客户端
- 创建通信接口(fd)
- 连接服务器,需要连接服务器的IP和端口
- 连接成功,客户端可以直接与服务器通信
- 通信结束,断开连接

七、TCP三次握手
- TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。
- TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP 头部。
- TCP 提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用四次挥手来关闭一个连接。
三个手保证两边的联系
这个图很有趣。
客户端发送请求消息SYN=1,序列=x,表明需要与服务器建立链接;
当服务器收到请求时,设置ACK为1,表示同意链接,SYN为1,序列数=y,确认序列数=x+1,对客户端作出响应,表示与客户端的链接;
客户端从服务器接收消息,发送ACK=1,确认序列=y+1,发送消息,服务器创建链接。
你为什么需要三个握手:
第三个握手是防止连接请求无法到达服务器并允许服务器错误打开连接。
2、“三手握手”的作用是双方能清楚地表明他们和对方接受和分配的能力是正常的。
- 第一次握手:客户端发送网络包
(不可以带数据)服务端已收到它。结论如下:
客户: 他们自己的发送能力是正常的;
服务端口: 其本身的接收能力是正常, 客户端的发送能力是正常.
- 二手:服务包
(不可以带数据)客户已经收到,结论如下:
客户端:其本身的发送和接收功能是正常,服务器的发送和接收功能是正常;
服务结束: 发送, 接收功能正常, 客户端的发送功能正常.
- 第三次握手:客户端发送网络包
(可以带数据)服务端已收到它。结论如下:
客户端:其本身的发送和接收功能是正常,服务器的发送和接收功能是正常;
服务结束: 他们自己的发送和接收能力是正常, 客户端的发送和接收能力是正常.
八、滑动窗口
- 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤,直接发送数据。因为人们不知道网络拥挤的情况,同时发送数据,导致中间节点封锁包,谁也发不了数据,所以有一个滑窗机制来解决这个问题。滑窗协议是提高吞吐量的一种技术,允许发送者在收到任何答复之前发送额外的包。接收器告诉发送者可以在指定的时间发送多少包(称为窗口大小)。
- TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小表示接收器有多少缓冲空间用于接收数据。发送者可以根据滑动窗口的大小确定该发送多少字节数据。当滑动窗口为0时,发送者通常不能再发送数据消息。
- 滑动窗口是一个在TCP中实现的载荷结构,例如ACK确认、流量控制和拥挤控制。
它可以被理解为接收和发送客户端和服务器缓冲器。
-
下面是流量控制和拥挤控制,我只是移动,详细的参考链接。
TCP 流量控制
其主要目的是控制发射器的发射速度,确保接收器能来接收,这样接收器缓冲区不会被填满,并且发射器仍在传输。
受信人发送的确认消息中的窗口字段可以用于控制发送者窗口的大小,从而影响发送者发送率。 如果窗口字段设置为0,发送者不能发送数据。
事实上,为了避免这个问题,定期发送一个终端主机发送一个称为“窗口检测”的数据段的机会,这个数据节只包含一个节,以便获取最新的窗口大小信息。
TCP 拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。发送方需要维护一个叫做cwnd窗口的条件变量。
慢开始与拥塞避免
- 消息的初始执行开始缓慢,造成cwnd = 1,发送者只能发送一个消息段;收到确认后,它将cwnd倍增,使发送者能够发送的邮件段数为: 2, 4, 8..
- 每轮的慢启动将使cwnd增加两倍,这会使克努德生长得非常快,因此,发射器的速度增加得太快,网络拥塞也更有可能发生。重新设置慢启动限制,当 cwnd >= ssthresh 时,进入拥塞避免,每轮增加1到cwnd。
- 如果超时发生, 请 ssthresh = cwnd/2 然后再放慢.
快重传与快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只缺少单独的段落,而不是网络拥塞。 因此,执行很快恢复,造成 ssthresh = cwnd/2, cwnd = ssthresh,指出它在这个点避免直接进入拥塞。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
九、四次挥手
客户端和主机可以主动启动分离,(三手由客户发起)第一个叫近的人就开始打破链条。 四波是两向的,就像三个手一样当连接被切断时,可以携带数据。

假设客户启动链断4次:
- 第一次挥手:客户端发送一个 FIN 段,并包含一个希望接收者看到的自己当前的序列号 K. 同时还包含一个 ACK 表示确认对方最近一次发过来的数据。
- 服务器将K加到1作为ACK序列值,表明它已经收到了以前的包。
服务器上层应用程序将被告知另一端已启动关闭操作,这通常会导致应用程序启动自己的关闭操作。
- 服务端启动自己的 FIN 分段, ACK=K+1, Seq=L.
- 客户端确认。进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。发送 ACK=L+1 报文给服务器。
你为什么需要四波:
- TCP连接是双向传输的等价模式,即双方可以同时发送或接收数据。 当一方想要关闭连接时,它发送命令告诉另一方我要关闭连接。
- 此时,另一方将返回ACK,在这个点,一个方向的连接将关闭。 然而,另一个方向仍然可以继续传输数据,即服务接收了客户端的 FIN信号,知道客户端想切断连接,但服务也可以发送未发送的数据。
- 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
- 当关闭连接时,当接收对方的 FIN消息时,它只是表明对方不再发送数据,而是接收数据,并且你是否关闭发送数据通道现在需要高级应用程序来决定,所以你的ACK和 FIN
(例如服务器尚未处理接收的数据)一般都会分开发。
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL(最大报文寿命)这样做有两个原因:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间的目的是使所有在该连接期间生成的消息从网络中消失,以便下一个新的连接不会与旧的连接请求消息出现。
TCP如何提供可靠的数据传输
- 建立连接(标记): 在通信之前确认通信实体的存在。
- 序列机制(序列、确认号码): 确保数据到达有序和完整.
- 数据校正(和校正): CRC检查所有数据。
- 超时再传输: 确保由于无法到达链接,数据可以再传输多个次。
- 窗口机制(window): 提供流量控制以避免过多的传输.
- 拥塞控制:同上。
TCP的粘附和拆卸
如果两个报告合并成一个,则一个是粘的,如果一个报告被分成两个,则一个是没有包装的。
为什么TCP粘贴和拆卸会发生?
- 如果发送的数据大于TCP缓冲区剩余空间的大小,就会发生调试。
- 如果发送的数据大于MSS(最大消息长度),TCP将在传输前解封。
- 如果发送的数据小于由TCP发送的缓冲器的大小,TCP将数据数次写入缓冲器并一次发送。
- 如果接收数据端的应用程序层没有及时读取接收缓冲区的数据,会发生粘贴。
粘包、拆包解决办法
消息定长发送器将每个包封入一个固定的长度(填充0是不够的)。
设置消息边界服务端通过消息边界将消息内容从网络流中分开。 在包的末端,添加一个重载行来分开,例如FTP协议。
将消息分割成头条和体消息标题包含一个显示消息的总长度(或消息的体长)的字段。
TCP状态转换

十三、半关闭
当从A到B的TCP链接中发送的 FIN请求关闭时,另一端B响应ACK(A端输入 FIN_WAIT_2状态),没有立即向A发送 FIN,侧面处于半连接状态(半开关),此时,A可以接收B发送的数据,但是A不能再向B发送数据。
使用接近来终止连接,但仅减少描述符的引用数,并不会直接关闭连接,仅作为描述符的引用
计数为 0 时才关闭连接。shutdown 不考虑描述符的引用计数,直接关闭描述符。也可选择中止一个方
向连接方向, 只停止阅读或停止写.
注意:
- 如果有多个进程共享一个套接字,close 每被调用一次,计数减 1 ,直到计数为 0 时,也就是所用
这个过程称为关闭,并且将释放插座。
- 在多个进程中,如果一个进程调用关闭(sfd, SHUT_RDWR),其他进程将无法操作文件描述器。
但一个进程关闭(sfd)不会影响其他进程。
十四、端口复用
端口重用最常见的用途是:
- 在服务器重新启动之前未释放绑定端口
- 程序突然退出,没有系统释放端口
总结
Cowboy Net C++课程说明
本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/30638.html。