热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络通信TCP/UDP——学习笔记

参考文献:35张图解被问千百遍的TCP三次握手和四次挥手面试题一、网络通信的基本概念1、TCP和UDP的区别TCP(TransmissionCont

参考文献:35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

一、网络通信的基本概念

1、TCP和UDP的区别TCP&#xff08;Transmission Control Protocol&#xff09;&#xff1a;传输控制协议&#xff0c;面向连接的服务&#xff08;类似打电话&#xff09;&#xff0c;安全、可靠&#xff08;三次握手、响应&#43;重传、四次挥手&#xff09;&#xff0c;速度相对较慢&#xff0c;一般应用在对安全性、完整性有严格要求的场景&#xff1a;文件传输&#xff08;ftp&#xff09;、SMTP、HTTP三次握手&#xff1a;A要知道&#xff0c;A能到B,B能到AB要也要知道&#xff0c;A能到B&#xff0c;B能到AA 你听得到吗 -> B(此时B知道了A能到B)&#xff08;A能到B且B能到A&#xff09;A <- 我能听到&#xff0c;你叫 BA 我也能听到-> B&#xff08;此时B知道了B也能到A&#xff09;四次挥手&#xff1a;目的是保证关闭前发送完所有未发送的数据包&#xff08;应用层已经交给底层了&#xff0c;但底层还没有完全发送出去&#xff09;。A 发送关闭请求 -> BA <- 发送请求相应 BB检查 是否有未发送完成的数据<- 可以关闭 BA 发送关闭消息-> BUDP&#xff08;User Datagram Protocol&#xff09;&#xff1a;用户数据报文协议&#xff0c;面向无连接的服务&#xff08;发短信&#xff09;0&#xff0c;不保证安全、可靠&#xff0c;但大多数情况下是可靠的&#xff0c;相对较快&#xff0c;流媒体&#xff08;在线视频、音频&#xff09;。
2、消息流应用层->表示层->会话层->传输层->网络层->数据链路层->物理层->数据链路层->网络层->传输层->会话层->表示层->应用层
3、消息包
当socket收到一个要发送的数据时&#xff0c;会先把数据进行拆分成bit流&#xff0c;然后再组成&#xff08;防丢失&#xff09;数据包&#xff08;可能会丢包&#xff09;。

二、套接字

socket是一种接口机制&#xff0c;可以让程序无论使用什么端口、协议、都可以从socket进出数据&#xff0c;它负责了进程与协
议之间的连接。
1、编程模型点对点&#xff08;p2p&#xff09;&#xff1a;一对一通信客户机/服务器&#xff08;C/S&#xff09;&#xff1a;一对多通信
2、函数int socket(int domain, int type, int protocol);功能&#xff1a;创建socket描述符&#xff0c;可以把socket当作文件来看待&#xff0c;发送数据就是写文件&#xff0c;接收数据就是读文件。domain:地址类型AF_UNIX/AF_LOCAL/AF_FILE 本地通信&#xff08;进程间通信&#xff09;AF_INET 基本32IP地址通信&#xff0c;IPv4 Internet protocolsAF_INET6 基本128IP地址通信&#xff0c;IPv6&#xff0c;IPv6 Internet protocolstype:通信协议SOCK_STREAM 数据流协议&#xff0c;TCPSOCK_DGRAM 数据报协议&#xff0c;UDPprotocol&#xff1a;特别通信协议&#xff0c;给0即可。返回值&#xff1a;socket描述符&#xff0c;类似文件描述符
3、通信地址注意&#xff1a;函数接口定义的是sockaddr&#xff0c;而实际提供的是sockaddr_un或sockaddr_instruct socketaddr{sa_family_t sa_family;char sa_data[14];}struct sockaddr_un {__SOCKADDR_COMMON(sun_); /* AF_UNIX */地址类型 参看domain参数 char sun_path[108]; /* pathname */socket文件的路径};struct sockaddr_in{__SOCKADDR_COMMON(sin_);in_port_t sin_port; // 端口号 大端字节序 参看联合struct in_addr sin_addr // ip地址 大端4字节整数}struct in_addr{in_addr_t s_addr; // }
4、绑定socket描述符与物理通信载体&#xff08;网卡或socket文件&#xff09;绑定在一起。int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);sockfd&#xff1a;socket描述符&#xff1a;socket函数的返回值addr&#xff1a;通信地址结构体&#xff0c;实际给的是sockaddr_un或sockaddr_in&#xff0c;需要强制类型转换。addrlen&#xff1a;通信地址结构体类型的字节数&#xff0c;使用sizeof计算。
5、连接int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);sockfd&#xff1a;socket描述符addr&#xff1a;通信目标地址addrlen&#xff1a;通信地址结构体类型的字节数&#xff0c;使用sizeof计算。返回值&#xff1a;在不同的编程模型下返回值意义不同&#xff0c;在本地通信返回加0&#xff0c;失败返回-1。
6、数据接收与发送&#xff1a;read/writessize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t send(int sockfd, const void *buf, size_t len, int flags);recv&#xff0f;send与read/write功能一样&#xff0c;flags多了是否阻塞的功能&#xff08;0阻塞&#xff0c;1不阻塞&#xff09;。
7、关闭套接字&#xff1a;close如果是网络通信&#xff0c;端口号并不会立即回收&#xff0c;大概会占用3分钟左右。
8、字节序转换
#include uint32_t htonl(uint32_t hostlong);功能&#xff1a;把32位本机字节序转换成32位的网络字节序uint16_t htons(uint16_t hostshort);功能&#xff1a;把16位本机字节序转换成16位的网络字节序uint32_t ntohl(uint32_t netlong);功能&#xff1a;把32位网络字节序转换成32位的本机字节序uint16_t ntohs(uint16_t netshort);功能&#xff1a;把16位网络字节序转换成16位的本机字节序
9、ip地址转换
#include
#include
#include int inet_aton(const char *cp, struct in_addr *inp);功能&#xff1a;把点分十进制的ip地址&#xff08;字符串&#xff09;转换成32位无符号整数&#xff0c;使用指针获取。in_addr_t inet_addr(const char *cp);功能&#xff1a;把点分十进制的ip地址&#xff08;字符串&#xff09;转换成32位无符号整数&#xff0c;使用返回值直接返回。char *inet_ntoa(struct in_addr in);功能&#xff1a;32位无符号整数表示的ip地址&#xff0c;转换成点分十进制的ip地址&#xff08;字符串&#xff09;。
10、本地通信编程模型进程A 进程B创建套接字&#xff08;AF_LOCAL&#xff09; 创建套接字&#xff08;AF_LOCAL&#xff09; 准备地址&#xff08;sockaddr_un&#xff09; 准备地址&#xff08;sockaddr_un&#xff09;绑定&#xff08;自己的socket/地址&#xff09; 连接&#xff08;connect&#xff0c;连接进程A的地址&#xff09;接收数据 发送数据关闭套接字

三、基于TCP协议的C/S模型

int listen(int sockfd, int backlog);功能&#xff1a;设置等待连接的最大数量sockfd:被监听的socket描述符backlog:等待连接的最大数量&#xff08;排队的数量&#xff09;int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能&#xff1a;等待连接sockfd连接addr&#xff1a;获取连接的地址addrlen&#xff1a;设置连接地址结构体的长度返回值&#xff1a;专门用于通信的描述符编程模型&#xff1a;Server Client创建socket套接字 创建socket套接字准备地址&#xff08;sockaddr_in,本机地址&#xff09; 准备地址&#xff08;服务器地址&#xff09;绑定&#xff08;bind&#xff09; 。。。监听&#xff08;listen&#xff09; 。。。等待连接&#xff08;accept、fork&#xff09; 连接&#xff08;connect&#xff09;接收请求(read/recv) 发送请求&#xff08;write/send&#xff09;响应请求(write/send) 接收响应&#xff08;read/recv) 关闭(close) 关闭&#xff08;close&#xff09;

四、基于UDP协议的C/S模型

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
功能&#xff1a;UDP协议专用的数据发送函数sockfd&#xff1a;套接字描述符buf&#xff1a;待发送的缓冲区首地址len&#xff1a;待发送的数据字节数flags&#xff1a;0阻塞&#xff0c;1不阻塞dest_addr&#xff1a;目标计算机地址&#xff08;发送&#xff09;addrlen&#xff1a;地址结构体的字节数返回值&#xff1a;成功发送的字节数ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
功能&#xff1a;UDP协议专用的数据接收函数sockfd&#xff1a;套接字描述符buf&#xff1a;数据存储位置 len&#xff1a;最大接收字节数flags&#xff1a;0阻塞&#xff0c;1不阻塞src_addr&#xff1a;获取发送者的地址addrlen&#xff1a;设置地址结构体的字节数返回值&#xff1a;成功接收的字节数。编程模型&#xff1a;
Server Client
创建套接字&#xff08;socket&#xff09; 创建套接字&#xff08;socket&#xff09;
准备地址&#xff08;本机地址sockaddr_in&#xff09; 准备地址&#xff08;目标机地址sockaddr_in&#xff09;
绑定&#xff08;bind&#xff08;sockfd&#43;addr&#xff09;&#xff09; 。。。
接收请求&#xff08;recvfrom&#xff09; 发送请求&#xff08;sendto&#xff09;
响应请求&#xff08;sendto&#xff09; 接收响应&#xff08;recvfrom&#xff09;
关闭套接字&#xff08;close&#xff09; 关闭套接字&#xff08;close&#xff09;
注意&#xff1a;从服务器到客户端返回的路线是UDP协议自己设计的。

实例

C语言实现socket通信TCP 程序参考
在这里插入图片描述


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
佐什么猗
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有