网络编程TCP/UDP

news/2024/5/18 11:52:26 标签: 网络, tcp/ip, udp

1 网络通信概述

1.1 IP 和端口

        所有的数据传输,都有三个要素 :源、目的、长度
        怎么表示源或者目的呢?请看图

所以,在网络传输中需要使用“IP 和端口”来表示源或目的。

1.2 网络传输中的 2 个对象:server client

        我们经常访问网站,这涉及 2 个对象:网站服务器浏览器。网站服务器平时安静地呆着,浏览器主动发起数据请求。网站服务器浏览器可以抽象成 2 个软件的概念:server 程序、client 程序。

1.3 两种传输方式:TCP/UDP

在一般的网络书籍中,网络协议被分为 5 层,如图
应用层:它是体系结构中的最高层,直接为用户的应用进程(例如电子邮件、 文件传输和终端仿真)提供服务。在因特网中的应用层协议很多,如支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议,支持文件传送的 FTP 协议, DNS ,POP3, SNMP Telnet 等等。
运输层:负责向两个主机中进程之间的通信提供服务。
运输层主要使用以下两种协议:

1. 传输控制协议 TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。

2. 用户数据包协议 UDP(User Datagram Protocol):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付

网络:负责将被称为数据包(datagram )的网络层分组从一台主机移动到另一台主机。
链路层:因特网的网络层通过源和目的地之间的一系列路由器路由数据报。

物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。

        这些层对于初学者来说很难理解,我们只需要知道:我们需要使用“运输层”编写应用程序,我们的应用程序位于“应用层”。
        使用“运输层”时,可以选择 TCP 协议,也可以选择 UDP 协议。

 1.3.1 原理上的区别

        TCP 向它的应用程序提供了面向连接的服务。这种服务有 2 个特点:可靠传输、流量控制(即发送方/ 接收方速率匹配)。它包括了应用层报文划分为短报文,并提供拥塞控制机制。
        UDP 协议向它的应用程序提供无连接服务。它没有可靠性,没有流量控制,也没有拥塞控制。

1.3.2 为何存在 UDP 协议       

        既然 TCP 提供了可靠数据传输服务,而 UDP 不能提供,那么 TCP 是否总是首选呢?      
        答案是否定的,因为有许多应用更适合用 UDP ,举个例子:视频通话时,使用 UDP ,偶尔的丢包、偶尔的花屏时可以忍受的;如果使用 TCP ,每个数据包都要确保可靠传输,当它出错时就重传,这会导致后续的数据包被阻滞,视频效果反而不好。

        使用 UDP 时,有如下特点:

1.关于何时发送什么数据控制的更为精细

        采用 UDP 时只要应用进程将数据传递给 UDPUDP 就会立即将其传递给网络层。而 TCP 有重传机制,而不管可靠交付需要多长时间。但是实时应用通常不希望过分的延迟报文段的传送,且能容忍一部分数据丢失。

2.无需建立连接,不会引入建立连接时的延迟。

3.无连接状态,能支持更多的活跃客户。

4.分组首部开销较小。

1.3.3 TCP/UDP 网络通信大概交互图     

        下面我们分别画出运用 TCP 协议和运用 UDP 协议的客户端和服务器大概交互图。
面向连接的 TCP 流模式:

UDP 用户数据包模式:

2 网络编程主要函数介绍

2.1 socket 函数

int socket(int domain, int type,int protocol);
此函数用于创建一个套接字。
  • domain 网络程序所在的主机采用的通讯协族(AF_UNIX AF_INET )
        ◼ AF_UNIX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对 Internet 的,因而可以允许远程通信使用。
  • type 网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM )
        ◼ SOCK_STREAM 表明用的是 TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。
        ◼ SOCK_DGRAM 表明用的是 UDP 协议,这样只会提不可靠,无连接的通信。
  • 关于 protocol,由于指定了 type,所以这个地方一般只要用 0 来代替就可以了。
        此函数执行成功时返回文件描述符,失败时返回-1, errno 可知道出错的详细情况。

2.2 bind 函数

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
从函数用于将地址绑定到一个套接字。
sockfd 是由 socket 函数调用返回的文件描述符。
my_addr 是一个指向 sockaddr 的指针。
addrlen sockaddr 结构的长度。
sockaddr 的定义:
struct sockaddr{
    unisgned short as_family;
    char sa_data[14];
};
        不 过 由 于 系 统 的 兼 容 性 , 我 们 一 般 使 用 另 外 一 个 结 构 (struct sockaddr_in) 来代替。
sockaddr_in 的定义:
struct sockaddr_in{
    unsigned short sin_family;
    unsigned short sin_port;
    struct in_addr sin_addr;
    unsigned char sin_zero[8];
}
如果使用 Internet 所以 sin_family 一般为 AF_INET
sin_addr 设置为 INADDR_ANY 表示可以和任何的主机通信。
sin_port 是要监听的端口号。
bind 将本地的端口同 socket 返回的文件描述符捆绑在一起 . 成功是返回 0, 失败的情况和 socket 一样。


http://www.niftyadmin.cn/n/5183621.html

相关文章

[Android]创建TabBar

创建一个包含“首页”、“分类”和“我的”选项卡的TabBar并实现切换功能,通常可以通过使用TabLayout结合ViewPager或ViewPager2来完成。以下是一个基本的示例,展示了如何使用Kotlin和XML来实现这个功能。 1.添加依赖项到build.gradle dependencies {/…

关于2023年汉字小达人市级比赛的填空题,及孩子如何提高打字速度

2023年汉字小达人市级比赛安排确定了以后,有一些父母来咨询我市级比赛的题型和往年的真题情况,当了解到市级比赛真的有填空题以后,他们又开始焦虑了,因为孩子平时在家里从了必要的英语打卡等学习以外,刻意不让孩子过多…

RHCE8 资料整理(六)

RHCE8 资料整理 第 6 篇 软件管理第 23 章 用rpm管理软件23.1 rpm查询23.2 rpm卸载23.3 软件包升级23.4 rpm验证 第 24 章 用yum/dnf管理软件包24.1 yum架构介绍24.2 用光盘搭建yum源24.3 创建私有仓库24.4 yum客户端配置24.5 yum基本使用24.5.1 查询24.5.2 安装与卸载24.5.3 下…

基于单片机的汽车安全气囊系统故障仿真设计

**单片机设计介绍, 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车安全气囊系统的故障检测系统是一种用于检测安全气囊系统故障的智能化设备,通过单片机控…

ABAP使用异步远程RFC实现并行处理

1、使用场景 当开发复杂报表,需要处理大量数据,不管怎么优化计算和查询语句,程序的运行效率还是达不到用户要求,怎么办? 为了解决这个问题,就需要程序实现并行处理。 本文档就是通过异步调用远程RFC的办…

RT-Thread STM32F407 DMA

这里以串口的DMA方式接收为例,串口1进行调试,串口2进行DMA接收 第一步,进入RT-Thread Settings配置DMA 第二步,进入board.h,定义串口及DMA宏 第三步,回到main.c,配置串口及DMA模式 第四步…

idea启动tomcat报错404

启动 Tomcat 时出现 404 错误通常意味着应用程序无法找到或访问。这可能是由于多种原因引起的。以下是一些可能的原因和相应的解决方法: 应用程序部署问题: 确保你的应用程序已经正确部署到 Tomcat 的 webapps 目录中。 检查 WAR 文件或应用程序文件夹的…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.77】引入百度最新提出RT-DETR模型中AIFI模块

前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍&…