【物联网】直接上代码解释TCP/UDP

这篇具有很好参考价值的文章主要介绍了【物联网】直接上代码解释TCP/UDP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 连接方式:TCP是面向连接的,UDP是无连接的。
  • 可靠性:TCP提供可靠数据传输,UDP不保证可靠性。
  • 数据传输方式:TCP使用字节流传输,UDP使用数据报传输。
  • 传输效率:TCP传输效率相对较低,UDP传输效率高。

TCP协议

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

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

三次握手(Three-Way Handshake)

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

步骤如下:
【物联网】直接上代码解释TCP/UDP,物联网,tcp/ip,udp,网络

  • 第一步(SYN):客户端发送一个带有 SYN(同步)标志的包给服务器,并通过设置一个初始序列号(随机选择)来开始连接建立。

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

  • 第三步(ACK):客户端收到服务器的响应后,会发送一个带有 ACK 标志的包给服务器,确认收到了服务器的确认。同时,客户端也会将确认号设置为服务器的初始序列号加1。

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

四次挥手(Four-Way Handshake)

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

步骤如下:
【物联网】直接上代码解释TCP/UDP,物联网,tcp/ip,udp,网络

  • 第一步(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);
        
        // 回复消息给客户端
        char *response = "Message received!";
        ssize_t bytes_sent = sendto(sockfd, response, strlen(response), 0, (struct sockaddr*)&client_addr, client_addr_len);
        if (bytes_sent == -1) {
            perror("sendto");
            return 1;
        }
    }
    
    // 关闭套接字
    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_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 = inet_addr("127.0.0.1");
    
    // 发送消息给服务器
    printf("Enter message to send to server: ");
    fgets(buffer, BUFFER_SIZE, stdin);
    ssize_t bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if (bytes_sent == -1) {
        perror("sendto");
        return 1;
    }
    
    // 接收服务器的响应
    memset(buffer, 0, BUFFER_SIZE);
    socklen_t server_addr_len = sizeof(server_addr);
    ssize_t bytes_received = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&server_addr, &server_addr_len);
    if (bytes_received == -1) {
        perror("recvfrom");
        return 1;
    }
    
    printf("Server response: %s\n", buffer);
    
    // 关闭套接字
    close(sockfd);
    
    return 0;
}

在UDP示例中,服务器端和客户端的代码都有所变化。服务器端使用了recvfrom()sendto()函数来接收和发送数据包,而不是读取和写入文件描述符。客户端同样使用了recvfrom()sendto()函数来接收和发送数据包。

二者区别:

  1. 连接方式:

    • TCP是面向连接的协议,需要先建立连接,然后才能进行数据传输。它使用三次握手来建立连接,确保双方的可靠通信。
    • UDP是无连接的协议,数据在发送前不需要建立连接。每个数据包都是独立的,发送方和接收方之间没有直接的联系。
  2. 可靠性:

    • TCP提供可靠的数据传输。它使用序列号、确认和重传机制来确保数据的完整性和有序性。如果丢失了数据包,TCP会自动重传,直到数据完整到达。
    • UDP不保证可靠性。它不提供流控制、拥塞控制、错误纠正和重传机制。如果发送的数据包丢失或损坏,接收方将无法获取正确的数据。
  3. 数据传输方式:

    • TCP使用字节流传输方式。数据被分割为小的数据块(分段),然后按序传输,接收方按序组装数据。因此,TCP传输的数据是保序的,适用于传输需要保持顺序的应用。
    • UDP则以数据报方式进行传输。每个数据包是独立的,不会分割或合并,也不会维持数据的顺序。每个数据包都有自己的目标地址和端口。
  4. 传输效率:

    • 由于提供了可靠性和连接管理等额外功能,TCP的传输效率相对较低。它可能存在一些延迟,并且有更高的开销。
    • UDP不提供这些额外功能,因此传输效率比TCP高。它通常用于实时通信、视频游戏等对于即时性要求比较高的应用。

TCP适用于需要可靠传输和顺序的数据,而UDP适用于实时通信和需要更高传输效率的场景。文章来源地址https://www.toymoban.com/news/detail-623995.html

到了这里,关于【物联网】直接上代码解释TCP/UDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

    TCP/IP网络通信协议最早是由 罗伯特·卡恩 (Robert E. Kahn)和 文顿·瑟夫 (Vinton G. Cerf)于1972年提出的,它是一个实际的协议栈。 OSI七层网络通信协议最早是 由国际标准化组织 (ISO)于1977年提出的,它是一个理论模型。TCP/IP网络通信协议由于其简单性和实用性,成为 事实上

    2024年01月22日
    浏览(68)
  • IP报文解析(TCP、UDP、 ICMP)及代码分享(C++)

    1.1 OSI 7层模型: 应用层: 功能:用户接口,文件传输、电子邮件、虚拟终端、文件服务 设备:网关 协议:HTTP、TFTP、SMTP、FTP、SNMP、DNS、Telnet 表示层: 功能:数据的表示,压缩和加密 设备:网关 协议:无 会话层: 功能:会话的建立和结束 设备:网关 协议:无 传输层:

    2024年02月09日
    浏览(42)
  • 【网络】UDP报头、TCP报头、IP报头、MAC头部、ARP头部

    前言:DUP报头、TCP报头、IP报头、MAC头部、ARP头部。 UDP报头由八个字节组成,每个字段都是两个字节 : 1.源端口号:发送方端口号, 需要对方回信的时候选用,不需要对方回信的时候置0 2.目的端口号:接收方端口号 , 在终点交付报文时需要用到 3.长度:UDP用户数据报的长

    2024年02月07日
    浏览(41)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(78)
  • 数据帧、IP数据包、TCP、UDP报文格式详解----网络通信原理

    物理层是TCP/IP模型的最底层,物理层定义其设备的 物理特性、电气特性 等,比如 网络接口卡、中继器、集线器、网线、无线电 。 物理层作用确保设备之间连接正常,包括建立、维护和断开物理连接等,物理层传输数据是通过电信号中的高低电压和低电压,也就是0101010的比

    2024年02月02日
    浏览(141)
  • UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议

    您的描述是正确的。UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议。他们之间有几个重要的区别,其中之一就是建立连接的方式。 连接方式: • TCP:在进行数据传输之前,需要通过三次握手(3-way handshake)建立连接。这可以确保

    2024年02月02日
    浏览(111)
  • 数据链路层(MAC)、网络层(IP)、传输层(TCP/UDP)抓包分析

    OSI模型(OSI model),开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI)。 抓包通常抓取数据链路层、网络层、传输层的包。 OSI主要关注5层,数据从上至下逐级封装,加入每层的头部信息,在物理层转换为比特率发送; 接收端使用逆向顺序

    2024年02月16日
    浏览(49)
  • 【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙

    🌺 个人主页: Dawn黎明开始 🎀 系列专栏: 网络奇幻之旅 ⭐ 每日一句:往前走,朝着光 📢 欢迎大家:关注 🔍 +点赞 👍 +评论📝+收藏⭐️ 文章目录 📋前言 一.网络通信 1.1网络通信协议 1.2TCP/IP协议中的四个层次 二.UDP协议 2.1定义 2.2UDP连接的交互过程 三.TCP协议 3.1定义

    2024年02月05日
    浏览(47)
  • Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议

    - 网络通信 概念:网络通信是指 通过计算机网络进行信息传输的过程 ,包括数据传输、语音通话、视频会议等。在网络通信中,数据被分成一系列的数据包,并通过网络传输到目的地。在数据传输过程中,需要确保数据的完整性、准确性和安全性。常见的网络通信协议有T

    2024年02月10日
    浏览(69)
  • 网络协议分析(一)(C语言实现---ethernet、arp、ip、icmp、udp、tcp)

    以太网协议是一种局域网通信协议,它通过物理层和数据链路层的协同工作,使用媒体访问控制地址和载波监听/冲突检测协议来实现计算机之间的稳定数据传输。在数据传输过程中,以太网会将数据封装成数据帧,并根据目标MAC地址来识别需要接收数据的计算机。通过这种方

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包