网络编程之TCP协议

devtools/2025/3/10 23:28:35/

传输层协议:UDP和TCP的区别

UDP:用户数据报协议

1.面向数据报

2.无连接

3.不安全,不可靠(尽最大努力交付)

4.机制简单,传输效率高

TCP:传输控制协议

1.面向数据流(流式套接字)

2.建立连接

3.安全可靠的传输协议

        应用场景:HTTP,MQTT,FTP

TCP的传输过程 

        三次握手:TCP建立连接时,需要进行三次握手,确保收发数据前,都已准备就绪

假设客户端和服务端通信:

1.第一次握手:客户端給服务端一个SYN(请求连接标志位)

2.第二次握手:服务端给客户端一个ACK+SYN

3.第三次握手:客户端给服务端一个ACK(响应标志位)

        四次挥手:TCP断开连接时,需要进行四次挥手,从而确保通信双方都已收发数据结束。

 TCP编程

        C/S模型:

 客户端的函数接口:

 socket():创建套接字

.socket 
      套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
      

   int socket(int domain, int type, int protocol);
      功能:
        创建一个用来通信的接口(文件描述符)
      参数:
        domain:通信的协议族(AF_INET:IPv4协议族)
        type:
            SOCK_DGRAM:数据报套接字    (UDP使用此类型)
            SOCK_STEAM:流式套接字    (TCP使用此类型)
            SOCK_RAW:原始套接字
        protocol:
            默认传0 按照协议的默认属性创建
      返回值:
        成功返回用来进行通信的文件描述符
        失败返回-1 

 connect()

connect
      int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
      功能:
        发送三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        addr:存放目的地址空间首地址
        addrlen:目的地址长度
      返回值:
        成功返回0 
        失败返回-1 

send()

send
      ssize_t send(int sockfd, const void *buf, size_t len, int flags);
      功能:
        发送数据
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:数据长度
        flag:属性默认为0 
      返回值:
        成功返回发送字节数
        失败返回-1 

recv() 

recv
      ssize_t recv(int sockfd, void *buf, size_t len, int flags);
      功能:
        接收数据 
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址 
        len:最多接收数据长度 
        flags:接收属性默认为0 
      返回值:
        成功返回实际接收字节数
        失败返回-1 
        连接断开返回0 

服务端所要的函数接口 

bind() :绑定IP地址和端口号

5.bind
      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
      功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
      参数:
            sockfd:套接字文件描述符 
            addr:IP地址和端口号结构体首地址
            addrlen:长度
      返回值:
            成功返回0
            失败返回-1 

listen() 

listen
      int listen(int sockfd, int backlog);
      功能:
        监听三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        backlog:最多允许等待尚未处理的三次握手链接个数
      返回值:
        成功返回0 
        失败返回-1 

accept() 

.accept
       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
       功能:
          处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
       参数:
          sockfd:套接字文件描述符
          addr:存放发送端IP地址空间首地址 
          addrlen:想要接收的IP地址的长度 
       返回值:
          成功返回新文件描述符(通信套接字)
          失败返回-1 

TCP粘包问题 

        粘包问题:在接受数据时,会出现多包数据粘在了一起

        原因:

        解决粘包的问题 :

检验:8位和检验/16位和检验

网络抓包 

UDP头部和TCP头部对比:UDP头部只有8个字节,而TCP有20个字节的固定首部 

        UTP头部(8字节)

源端口目标端口
长度检验和

        TCP头部

TCP报文头 

TCP机制 

 

   

 


http://www.ppmy.cn/devtools/166132.html

相关文章

【哇! C++】类和对象(五) - 赋值运算符重载

目录 ​编辑 一、运算符重载 1.1 运算符重载概念 1.2 全局运算符重载 1.3 运算符重载为成员函数 二、赋值运算符重载的特性 2.1 赋值运算符重载需要注意的点 2.2 赋值运算符重载格式 2.2.1 传值返回 2.2.2 传引用返回 2.2.3 检查自己给自己赋值 三、赋值运算符重载的…

Autojs无线连接vscode方法

1.获得电脑的IP 在电脑的CMD界面输入 ipconfig 然后找到ipv4的那一行,后面的即是你的电脑IP地址 2.打开vscode的autojs服务 安装autojs插件 在vscode界面按下ctrlshiftp 输入autojs 找到 点击 之后打开手机上的autojs 之后输入刚刚电脑上的地址 可以看到vsc…

文本处理Bert面试内容整理-BERT的优点是什么?

BERT(Bidirectional Encoder Representations from Transformers)作为一种预训练语言模型,具有许多显著的优点,特别是在处理自然语言理解任务时表现出了卓越的性能。以下是BERT的主要优点: 1. 双向上下文建模 ● 双向学习上下文:BERT的核心创新在于它采用了双向自注意力机…

在window终端创建docker容器的问题

问题: 错误原因: PowerShell 换行符错误 PowerShell 中换行应使用反引号而非反斜杠 \,错误的换行符导致命令解析中断。 在 Windows 的 PowerShell 中运行 Docker 命令时遇到「sudo 无法识别」的问题,这是因为 Windows 系统原生不…

AI视频生成工具清单(附网址与免费说明)

以下是一份详细的AI视频制作网站总结清单,包含免费/付费信息及核心功能说明: AI视频生成工具清单(附网址与免费说明) 1. Synthesia 网址:https://www.synthesia.io是否免费:免费试用(生成视频…

种子填充(Floodfill、泛滥填充、洪水填充) 算法c++模板

种子填充(Floodfill) 算法: 从任意 W 开始,不停地把邻接的 W 用 . 代替。1 次 DFS 后与初始 W 连接的所有 W 都被替换成 . 了。 因此,直到图中不存在 W 为止,总共进行 DFS 的次数就是答案了。 问题: 有一个大小为 N x M 的园子,雨后积水。 8 连通的积水被认为是连接在…

C++高精度算法详解:实现超大整数运算

一、高精度算法概述 在C编程中,int型(-2147483648 ~ 2147483647)和long long型(-9223372036854775808~9223372036854775807)的数值范围有限。当处理超过19位的整数(如30位或200位的数字&#x…

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点,提示如下 No input file specified. 可能是文件权限有问题,也可能是“.user.ini”文件路径没有配置对,最简单的办法就是直接将它删除掉,还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…