[C++ 网络协议编程] TCP/IP协议

news/2024/7/3 0:48:04

目录

1. TCP/IP协议栈

2. TCP原理

2.1 TCP套接字中的I/O缓冲

2.2 TCP工作原理

2.2.1 三次握手(连接)

2.2.2 与对方主机的数据交换

2.2.3 四次握手(断开与套接字的连接)


TCP(Transmission Control Protocol传输控制协议):对数据传输过程的控制。

1. TCP/IP协议栈

 TCP/IP分为四层:

  1. 链路层(物理层):物理链接领域标准化的结果,专门定义LAN、WAN、MAN等网络标准,通俗点说就是,硬件之间的物理连接层
  2. IP层:IP层功能主要是确定传输数据的路径,但IP本身是面向消息,不可靠的,可能会发生数据丢失或错误的问题。
  3. TCP/UDP层(传输层):TCP则可以解决IP层数据丢失或错误的问题,赋予不可靠的IP协议可靠性。

    如图所示,是TCP简单的功能,会确认数据包是否到达。
  4. 应用层:程序员编写软件过程中,根据程序特点决定服务器端和客户端之间的数据传输规则。

2. TCP原理

2.1 TCP套接字中的I/O缓冲

问:如果服务器端一次性传输了40字节,而客户端却是通过4次read函数,每次读取10字节的方式来接收数据,那么当客户端第一次接收了10字节的数据,剩下30字节的数据去哪了呢?

答:剩下30节的数据都在I/O缓冲里。

实际上write函数调用后并不是马上进行数据传输的,read函数也不是马上进行数据读取的,而是如图:

总结:在write函数执行时,会先将数据,移动到输出缓冲里,在适当的时候,再将数据传送到对方的输入缓冲里,然后对方再通过read函数,从输入缓冲里读取数据。

I/O缓冲有如下特性:

  1. I/O缓冲在每个TCP套接字单独存在
  2. I/O缓冲在创建套接字时自动生成
  3. 即使关闭套接字也会继续传输输出缓冲中遗留的数据
  4. 关闭套接字丢失输入缓冲中的数据

问:如果客户端输入缓冲为50字节,服务器端却传输了100字节,那么会怎么办?

答:TCP会控制数据流,不会发生超过输入缓冲大小的数据传输

TCP中有滑动窗口协议,会在传输前,告知对方套接字,己方可以接收多少字节的数据。所以TCP不会因为缓冲溢出而丢失数据

write函数返回的时间点:

        write函数和Windows的send函数,不会在完成向对方主机的数据传输时返回,而是在数据移动到输出缓冲时就返回。然后TCP会保证对输出缓冲中数据的传输。

2.2 TCP工作原理

以下原理,保证了TCP的数据传输是可靠的,有序的,基于连接的。

2.2.1 三次握手(连接)

套接字是以全双工方式工作的,也就是说,它可以双向传输数据

以上可以解释成如下:

SYN(Synchronization):表示收发数据传输的同步消息。

ACK:命令正确应答;确认字符(acknowledgement character)。

SEQ:序列。

收发数据前,向数据包分配序号,并向对方通报此序号, 这样可以在数据丢失时马上查看并重传丢失的数据包,防止数据丢失。

三次握手后,主机之间彼此就绪,准备数据交换。

2.2.2 与对方主机的数据交换

主机A向主机B发送100个字节的数据,数据包的序号为1200,主机B回复给主机A,序号为1301的数据包ACK应答,为什么是序号为1301的数据包?

因为:ACK号=SEQ号+传递的字节数+1这样如果ACK号不是1200+100+1=1301的话,那么久说明,传递的字节数有丢失,就可以通知对方重传,加一是为了告知对方下次要传递的SEQ号。

这之间如果发生了错误,如图:

当主机A发送SEQ1301给主机B时,主机B没有接收到,不会发送ACK应答,主机A过了一段时间没有接收到主机B传来的应答,那么就会重传。主机A的TCP套接字会启动计时器等待ACK应答,如果超时,则重传。

2.2.3 四次握手(断开与套接字的连接)

FIN:断开连接,双方各发送一次FIN消息后断开连接。

含义和上述三次握手的差不多,这里主机B向主机A传递了两次ACK5001是因为,主机B向主机A发送第一次ACK后,会等待一段时间,看主机A是否还有数据要传给主机B,没有了,则会传递第二次ACK数据,并设置FIN消息。


http://lihuaxi.xjx100.cn/news/1441429.html

相关文章

期权定价模型系列【5】—ETF期权数据

1.前言 对期权定价模型进行研究时,往往需要匹配的实际数据,国内上市时间超过两年、主流的ETF期权包括华夏上证50ETF期权、沪深300ETF期权等,其对应的标的资产分别为华夏上证50ETF、华泰柏瑞沪深300ETF、嘉实沪深300ETF。 2.上证50ETF期权合约…

Android应用开发(37)LTPO帧率测试基于Surfaceview

Android应用开发学习笔记——目录索引 参考android官网: Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

什么是CSS中的渐变(gradient)?如何使用CSS创建线性渐变和径向渐变?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 渐变(Gradient)在CSS中的应用⭐ 线性渐变(Linear Gradient)语法:示例: ⭐ 径向渐变(Radial Gradient)语法:示例: ⭐ 写…

16收16发ARINC429模块

6通道发送, 16通道接收 发送通道: 每路发送通道FIFO大小为:511 x 32bit(CHR32216/32316) ,缓存256条发送消息(CHR32216-EX/32316-EX) 发送FIFO可设置复位 可设置消息间隔, 字间隔和发送帧的预定数呈 发送波特率100Kbps、50Kbps、…

LeetCode 36题:有效的数独

题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图&#xff…

PAT(Advanced Level)刷题指南 —— 第九弹【Dijkstra + DFS】

一、1018 Public Bike Management 1. 问题重述 杭州市设有公共自行车服务,为来自世界各地的游客提供了极大的便利。可以在任何车站租用一辆自行车,然后将其还给城市中的其他车站。 公共自行车管理中心(PBMC)不断监视所有站点的实时容量。如果工作站刚满一半,则称其处于理…

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀。 全文大纲 PULSE - 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化。 Depix - 给打了马赛克的文字去码。 TecoGAN - 给视频去马赛克或者进行超分辨率。 Sk…

linux0.95(VFS重点)源码通俗解读(施工中)

文件系统在磁盘中的体现 下面是磁盘的内容,其中i节点就是一个inode数组,逻辑块就是数据块可用于存放数据 操作系统通过将磁盘数据读入到内存中指定的缓冲区块来与磁盘交互,对内存中的缓冲区块修改后写回磁盘。 进程(task_struct * task[N…