【物联网】直接上代码解释TCP UDP_物联网 udp tcp

+ [二者区别:](#_322)

TCP协议

TCP就是在不可靠的信道上建立可靠的连接,TCP传输需解决三次握手和四次挥手的过程。TCP是一种可靠的面向连接的协议,它提供了可靠的数据传输和错误修复机制。这使得TCP广泛用于需要可靠数据传输的应用,例如电子邮件、文件传输和Web浏览器。

TCP三次握手和四次挥手
当使用TCP建立连接时,它会在客户端和服务器之间创建一个虚拟的连接,并确保数据在这个连接上按照正确的顺序传输。这是通过使用序列号、确认号和窗口大小等机制来实现的。TCP的三次握手和四次挥手是为了建立和终止TCP连接而定义的一种协议流程。下面详细介绍了TCP的三次握手和四次挥手的过程。

三次握手(Three-Way Handshake)

三次握手是在客户端和服务器之间建立TCP连接时使用的过程。它的目的是确保双方都愿意建立连接,并进行必要的初始化设置。

步骤如下:
上次握手

  • 第一步(SYN):客户端发送一个带有 SYN(同步)标志的包给服务器,并通过设置一个初始序列号(随机选择)来开始连接建立。
  • 第二步(SYN+ACK):服务器收到客户端的请求后,如果同意建立连接,就会发送一个带有 SYN 和 ACK(确认)标志的包给客户端。服务器也会选择一个初始序列号,并将确认号设置为客户端的初始序列号加1。
  • 第三步(ACK):客户端收到服务器的响应后,会发送一个带有 ACK 标志的包给服务器,确认收到了服务器的确认。同时,客户端也会将确认号设置为服务器的初始序列号加1。

完成了这个三次握手之后,TCP连接就建立起来了,双方可以开始进行数据传输。

四次挥手(Four-Way Handshake)

四次挥手是在客户端和服务器之间终止TCP连接时使用的过程。它的目的是双方都能够安全地关闭连接并释放资源。

步骤如下:
四次挥手

  • 第一步(FIN):当客户端希望关闭连接时,它发送一个带有 FIN(结束)标志的包给服务器,表示不再发送数据。
  • 第二步(ACK):服务器收到客户端的结束请求后,发送一个带有 ACK 确认标志的包给客户端,表示收到了客户端的结束请求。
  • 第三步(FIN):当服务器也希望关闭连接时,它发送一个带有 FIN 标志的包给客户端,表示不再发送数据。
  • 第四步(ACK):客户端收到服务器的结束请求后,发送一个带有 ACK 确认标志的包给服务器,表示收到了服务器的结束请求。

完成了这个四次挥手之后,TCP连接就被正式关闭,双方不再进行数据传输。

示例代码:

下面是一个使用TCP的简单示例,展示了如何在服务器和客户端之间建立连接并进行通信:

服务器端(server.c):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

#define PORT 8080
#define BUFFER\_SIZE 1024

int main() {
    int sockfd, client_sockfd;
    struct sockaddr\_in server_addr, client_addr;
    char buffer[BUFFER_SIZE];
    
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket");
        return 1;
    }
    
    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    
    // 绑定套接字到服务器地址
    if (bind(sockfd, (struct sockaddr\*)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        return 1;
    }
    
    // 监听请求
    listen(sockfd, 5);
    
    printf("Server started. Waiting for connections...\n");
    
    while (1) {
        // 接受连接
        int client_addr_len = sizeof(client_addr);
        client_sockfd = accept(sockfd, (struct sockaddr\*)&client_addr, &client_addr_len);
        if (client_sockfd == -1) {
            perror("accept");
            return 1;
        }
        
        // 读取客户端发送的消息
        memset(buffer, 0, BUFFER_SIZE);
        read(client_sockfd, buffer, BUFFER_SIZE);
        printf("Received message from client: %s\n", buffer);
        
        // 发送响应给客户端
        write(client_sockfd, "Message received!", strlen("Message received!"));
        
        // 关闭客户端套接字
        close(client_sockfd);
    }
    
    // 关闭服务器套接字
    close(sockfd);
    
    return 0;
}

客户端(client.c):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define PORT 8080
#define BUFFER\_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr\_in server_addr;
    char buffer[BUFFER_SIZE];
    
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket");
        return 1;
    }
    
    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet\_addr("127.0.0.1");
    
    // 连接服务器
    if (connect(sockfd, (struct sockaddr\*)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        return 1;
    }
    
    // 发送消息给服务器
    printf("Enter message to send to server: ");
    fgets(buffer, BUFFER_SIZE, stdin);
    write(sockfd, buffer, strlen(buffer));
    
    // 读取服务器的响应
    memset(buffer, 0, BUFFER_SIZE);
    read(sockfd, buffer, BUFFER_SIZE);
    printf("Server response: %s\n", buffer);
    
    // 关闭套接字
    close(sockfd);
    
    return 0;
}

以上是一个使用TCP的简单示例。在服务器端,我们首先创建一个套接字,绑定地址和端口,并开始监听客户端连接。当有客户端请求连接时,我们接受连接,读取客户端发送的消息并给出响应。在客户端,我们创建一个套接字,连接到服务器,并发送消息给服务器并读取响应。

UDP协议

UDP是一种无连接的协议,它提供了一种简单的数据传输机制,适用于一些不需要可靠数据传输的应用,例如游戏、流媒体和实时通信。

与TCP不同,UDP没有建立连接的过程,而是直接发送和接收数据包。UDP也不提供错误修复机制,数据包可能会丢失或乱序到达。因此,在使用UDP时,我们需要自己处理数据的可靠性和顺序问题。

UDP特点
  1. 无连接性:UDP是无连接的协议,发送方和接收方之间没有建立和维护连接的过程。每个数据包都是独立的,可以独立发送和接收。
  2. 不可靠性:UDP不提供可靠性保证。发送方将数据包发送给接收方,但无法确保数据包是否成功到达目标。UDP不进行重传,也不进行拥塞控制。如果数据包在传输过程中丢失或损坏,接收方将无法获取完整、正确的数据。
  3. 快速性:由于UDP的无连接、不可靠性质,它具有较低的开销和高效的传输速度。它适用于传输对实时性要求较高的数据,如实时音频、视频流和实时游戏数据。
  4. 数据报方式:UDP以数据报的形式传输数据。每个数据报都有自己的源端口和目标端口,独立于其他数据报。数据报之间没有顺序关系,也不进行分段和组装。
  5. 尺寸限制:UDP数据报的大小被限制在64KB以内。大于这个尺寸的数据需要进行分片,并在接收方进行重新组装。
  6. 应用场景:UDP常用于实时应用程序,如实时音视频传输、在线游戏、视频会议等。它适用于不要求可靠传输和顺序性的应用,同时追求低延迟和快速响应的特性。

需要注意的是,由于UDP不提供可靠性保障,应用程序需要额外的机制来处理丢包、重传以及应用层的错误处理。

示例代码:

以下是一个使用UDP的简单示例,展示了如何在客户端和服务器之间进行通信:

服务器端(server.c):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

#define PORT 8080
#define BUFFER\_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr\_in server_addr, client_addr;
    char buffer[BUFFER_SIZE];
    
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        perror("socket");
        return 1;
    }
    
    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    
    // 绑定套接字到服务器地址
    if (bind(sockfd, (struct sockaddr\*)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        return 1;
    }
    
    printf("Server started. Waiting for messages...\n");
    
    while (1) {
        // 接收消息
        memset(buffer, 0, BUFFER_SIZE);
        socklen\_t client_addr_len = sizeof(client_addr);
        ssize\_t bytes_received = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr\*)&client_addr, &client_addr_len);
        if (bytes_received == -1) {
            perror("recvfrom");
            return 1;
        }
        
        printf("Received message from client: %s\n", buffer);
        
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/d631df6a7a26b656cc2639462a5b5187.png)

![img](https://img-blog.csdnimg.cn/img_convert/a4150e92268c5e71f02f91a9604a4b9b.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/6501adcaa8582e048c0666ae2c39ca46.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/dfc12e640f0c3ec98c96e00cdde71e76.png)

![img](https://img-blog.csdnimg.cn/img_convert/f826b0ba0e385f60cc4d43e94f5944f3.png)

![img](https://img-blog.csdnimg.cn/img_convert/6cedbab0f0bd6ca5b683ce2fe421f644.png)

![](https://img-blog.csdnimg.cn/img_convert/b8277981593cb594d69ebfa33cdd776e.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


250309)]

[外链图片转存中...(img-mXLapBRB-1715629250309)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT是一种轻量级的消息传输协议,而HTTP、UDPTCP是不同的网络协议。 HTTP是一种应用层协议,用于在客户端和服务器之间传输超文本。它是一种面向请求-响应的协议,通过TCP连接进行通信。HTTP是一种可靠的协议,它提供了数据的可靠传输和错误检测机制。 UDP是一种用户数据报协议,它是一种无连接的协议,不提供可靠性和错误检测机制。UDP适用于实时应用,如IP电话和实时视频会议,因为它具有较低的延迟和较高的传输速度。 TCP是一种传输控制协议,它是一种面向连接的协议,通过可靠的字节流进行通信。TCP提供了可靠的数据传输,确保数据的无差错、不丢失、不重复,并按顺序到达。TCP适用于需要可靠传输的应用,如文件传输和网页浏览。 MQTT是一种基于发布-订阅模式的消息传输协议,它使用TCP或其他传输协议进行通信。MQTT适用于物联网设备之间的低带宽、高延迟和不稳定网络环境下的消息传输。 综上所述,HTTP、UDPTCP和MQTT是不同的网络协议,它们在可靠性、连接方式和适用场景等方面有所区别。 #### 引用[.reference_title] - *1* *2* *3* [HTTP/TCP/UDP/MQTT的区别与定义](https://blog.csdn.net/qq_41854291/article/details/115721493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值