我是靠谱客的博主 美丽猫咪,最近开发中收集的这篇文章主要介绍socket UDP、TCP发送接收数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

socket UDP、TCP发送接收数据

    • 基础计算机网络概念
      • 两台电脑的通信
      • IP地址与协议
      • 公网IP和内网IP
      • NAT技术
      • 端口介绍
    • socket简介
      • TCP/IP协议
      • socket
    • UDP发送接收数据
      • udp发送数据
      • udp接收数据
    • TCP发送接收数据
      • TCP协议介绍
      • 三次握手和四次挥手
      • TCP的特点
      • TCP客户端的构建
      • TCP服务端的构建
      • 为客户端服务多次和为多个客户端服务
      • 文件下载器
    • TCP与UDP的区别

基础计算机网络概念

两台电脑的通信

  • 两台电脑之间的通信类似于写信,数据通过网线传输到服务器,在经过服务器传输给目标电脑,其中ip地址是唯一标识,用来识别你要发送的对象,在写信中ip地址就相当于我们的通信地址。

IP地址与协议

  • 规定网络地址的协议称为ip协议,它定义的地址为ip地址,目前广泛采用的v4版本即ipv4,其由32位2进制表示。
  • 一个ip地址通常写为四段十进制数
  • 范围为从0.0.0.0到255.255.255.255
  • 我们可以通过ipconfig命令来查看本机的网卡信息,;Linux的命令为ifconfig在这里插入图片描述
  • 上图中通过ipconfig命令可以查看本机的ip地址,有v6和v4两个版本,一般常用的是v4的地址
  • ip地址版本
    • ipv4
      • 广泛在用
      • 版本为v4
      • 地址位数为32位
      • 地址有限,几乎全部耗尽
    • ipv6
      • 试验阶段,作为下一阶段的IP地址
      • 版本为v6
      • 地址位数为128位
      • 因为增加了地址位数,所以拥有很多种排列组合,号称可以为全世界的每一粒沙子编上一个地址

公网IP和内网IP

  • 公网IP:即互联网IP,是ipv4协议分配的有效的ip地址。
  • 内网IP:即局域网IP,是在一个局域网里随机分配得到的ip地址。
  • 之所以出现公网IP和内网IP是因为,ipv4的地址是有限的,而为了应对地址的不足,开发出了内网IP,将一个公司、学校或者家庭看作是一个局域网,当其内部需要上网时,给每个设备都分配一个ipv4地址显然是不现实的,因此目前的做法是将公司的公网IP看作一个网关,由网关给局域网内部的设备随机分配虚拟IP地址,这些虚拟ip地址用来识别具体是哪个设备,并通过NAT转换实现内网访问外网的能力。
  • 内网的主要作用
    • 共享传输信道:简单地理解就是不需要每台电脑一个外网IP地址。
    • 传输速率高:内网之间的电脑因为没有外网网络拓扑的复杂性,所以互相通信的网络可以很快。
    • 误码率低:因为通信距离很近,所以误码率很低,换句话说就是网络很稳定。

NAT技术

  • 上面介绍了公网IP和内网IP,我们可以知道内网IP其实是一个随机分配的地址,也就是说它其实是不存在的,不被认可的,那么如何实现内网访问外网的功能呢,将由NAT技术来实现。
  • 简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关(可以理解为出口,打个比方就像院子的门一样)处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共 IP地址紧缺的问题。
  • 比如一个公司的IP地址为192.168.1.1,这是它的网关,其内部有三台电脑,内网分配的ip地址分别为192.168.1.2,192.168.1.3,192.168.1.4,当其中一台电脑要访问外网时,NAT技术将电脑的ip地址加端口映射成网关的IP地址加端口,即通过网关去访问外网,既解决了ip地址紧缺的问题,又保证了用户的使用。

端口介绍

  • 当我们使用网络进行通信时,除了知道对方的ip地址之外,我们还需要知道用什么软件进行通信,那么如何识别我们通过哪种软件进行通信呢,这就是端口的作用。
  • 通常每个应用程序都会占用一个端口,同一时间只会有一个程序占用一个端口,这样就是的端口具有唯一性,是的我们的电脑可以通过端口来识别具体是哪个应用程序在进行通信。
  • 我们这里举一个简单的例子,当我们取银行取钱时,我们可以把银行想象成一个主机,当我们进门之后,会有服务人员问我们要办什么业务,然后会告诉我们取钱去三号窗口,这样我们就不会走错,而窗口就相当于网络里的端口。
  • 端口分为知名端口和动态端口
    • 知名端口的范围是0-1023,这些端口通常是固定的分配给一些公认的服务,例如80端口分配给http服务,21端口分配给FTP服务。
    • 动态端口的范围是1024-65535,这类端口,不会固定的分配,是留给计算机用来临时动态的分配的,也是我们的应用程序通常会临时占用的端口。
    • 我们可以通过netstat -a -n命令来查看被占用的端口在这里插入图片描述

socket简介

TCP/IP协议

  • 计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。
  • TCP/IP 是互联网相关的各类协议族的总称,比如:TCP、UDP、IP、FTP、HTTP、ICMP、SMTP 等都属于 TCP/IP 族内的协议
  • TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
  • tCP/IP网络模型四层模型从根本上和OSI七层网络模型是一样的,只是合并了几层在这里插入图片描述

socket

  • socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。白话说,socket就是两个节点为了互相通信,而在各自家里装的一部’电话’。
  • 加入socket后,网络关系如下图所示:在这里插入图片描述

UDP发送接收数据

udp发送数据

  • 主要分为三步:
    • 创建套接字
    • 发送数据
    • 关闭套接字
  • 我们这里通过网络调试助手netassit来辅助进行代码的编写,以网络调试助手作为接受发送数据的另一方 在这里插入图片描述
  • 代码的编写如下:
    在这里插入图片描述
  • 通过socket.socket命令来创建套接字,第一个参数为协议族,第二个参数为套接字类型,udp的类型为SOCK_DGRAM,通过socket.sendto来发送数据,里面的参数为要发送的数据和发送地址,由于数据发送的方式是通过字节的形式发送,而我们输入的数据为字符串,所以需要对要发送的数据进行编码,最后关闭套接字。
  • 而网络调试助手作为接收方的结果为:在这里插入图片描述
  • 上述的代码实现了用udp发送数据,但是发送了一次之后,程序就会自动结束,不符合我们的正常使用,接下来对其进行一些简单的优化,使得可以进行多次发送。在这里插入图片描述
  • 增加了一个while死循环,这样就实现了可以多次发送的功能,同时增加if判断,以便在我们需要的时候可能关闭。运行结果如下:在这里插入图片描述
    在这里插入图片描述
    上图中我们可以看到,实现了能够多次发送的功能,但是在发送中文“你好”的时候,出现了乱码,这是因为没有调整解码方式的原因,在网络调试助手界面右键,将字符集编码改为UTF-8即可。

udp接收数据

  • 接收数据与发送数据类似,但有一些不同,其主要步骤为:
    • 创建套接字
    • 绑定本地信息
    • 接收数据
    • 打印数据
    • 关闭套接字
  • 将网络调试助手作为发送方,我们本地作为接收方进行代码编写,如下所示: 在这里插入图片描述
  • 创建套接字的方式和发送时一样,接下来需要绑定本地信息,即绑定本地ip地址,将ip地址和端口写在一个元组里面作为参数传入bind方法,使用recvfrom方法来等待接收数据,因为数据的传送是以字节的方式进行,所以需要进行解码,参数为一次可接收的数据大小,最后关闭套接字。
  • 程序运行的结果如下:
  • 首先将网络调试助手里面的主机地址改为我们绑定的地址,做好发送的准备,并发送如下信息:在这里插入图片描述
  • python上接收到的信息如下所示:在这里插入图片描述
  • 将以上两个程序合在一起就可以编写出一个简易的聊天器

TCP发送接收数据

TCP协议介绍

  • TCP协议,传输控制协议,是一种面向连接的(通信双方必须先建立连接才能进行数据的传输,电话接通才可以传输数据)、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
  • TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
  • TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发生数据。类似于生活中,“打电话”。

三次握手和四次挥手

  • 三次握手
    • 形式:第一次握手,有客户端向服务端发送连接请求,第二次握手,服务端向客户端回应连接请求,第三次握手,客户端收到服务端的回应后再次发送请求,表示开始进行连接。
    • 三次握手的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了
    • 第三次握手的目的:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
  • 四次挥手
    • 形式:第一次挥手,主机1向主机2发送报文,表示没有数据要发送了,第二次挥手,主机2向主机1发送报文,同意关闭请求;第三次挥手,主机2向主机1发送报文,请求关闭连接;第四次挥手, 主机1收到主机2的报文并向主机2再次发送,随后进入待机模式,主机2收到主机1的报文之后关闭,主机1再等待一定时间后,确定主机2正常关闭,随即也关闭。
    • 目的:TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

TCP的特点

  • 面向连接
  • 可靠传输
    • TCP采用发送应答机制
    • 超时重传:等待一定时间没有收到回应之后会重新发送。
    • 错误校验:通过特定的函数来检查数据是否有误。
    • 流量管控和阻塞管理

TCP客户端的构建

  • TCP的客户端构建与UDP发送数据大致相同,只是多了一个连接的步骤,其步骤如下;
    • 建立套接字
    • 连接服务器
    • 发送数据
    • 关闭套接字
  • 具体的实现代码如下: 在这里插入图片描述
  • 这里与UDP不同的是,创建套接字时类型的选择为SOCK_STREAM,连接服务端使用connect函数,其参数为ip地址和端口组成的元组,ip地址为字符串形式,端口为整型,在发送数据时不再使用sendto函数,因为我们已经连接了服务端,明确了要发送的地址,所以使用send函数即可,接收数据也是一样,使用recv或者recvfrom均可。
  • 其运行结果如下:在这里插入图片描述在这里插入图片描述

TCP服务端的构建

  • TCP服务端的构建主要步骤如下:
    • 创建套接字
    • 绑定本地信息
    • 转为接听状态
    • 等待接收数据
    • 发送/接收数据
    • 关闭套接字
  • 具体代码实现如下:在这里插入图片描述
  • 绑定本地信息的方式和udp相同,使用listen函数转成接听模式,即等待客户端的连接,其参数表示相应套接字排队的最大连接个数,通过accept函数来创建一个新的套接字来为接入的客户端服务,并返回新的socket和其地址,这样做的好处是可以空出原来的监听套接字端口,继续能够为下一个连接的客户端服务,收发数据与前面一致,关闭时先关闭新生成的套接字,在关闭监听套接字。
  • 运行结果如下:在这里插入图片描述
    在这里插入图片描述

为客户端服务多次和为多个客户端服务

  • 从上面的运行结果,我们可以发现当发送一次消息之后,程序会自动停止运行,无法满足正常的需要,因此首先我们将代码优化到可以进行多次服务,与UDP一样采用while循环的方式实现:在这里插入图片描述
  • 这里发现当关闭客户端的时候,客户端会给服务端发送一个空字符串,因此将这个作为连接结束的条件,即当客户端关闭的时候连接结束。
    运行结果如下:
    在这里插入图片描述
    在这里插入图片描述
  • 实现了为客户端多次服务之后,在此基础上再增加一个while循环即可实现为多个客户端服务:在这里插入图片描述
    运行结果为:在这里插入图片描述

文件下载器

  • 接下来运用刚才的只是编写一个简易的文件下载器

  • 主要分为客户端和服务端

  • 客户端的步骤为:

    • 创建套接字
    • 连接服务器
    • 发送要下载的文件名
    • 接收服务端的数据
    • 保存文件
    • 关闭套接字
  • 具体实现的代码如下:在这里插入图片描述

  • 服务端的步骤为:

    • 创建套接字
    • 绑定本地信息
    • 转为接听模式
    • 等待接收信息
    • 发送文件数据
    • 关闭套接字
  • 具体实现代码如下: 在这里插入图片描述

  • 我们创建一个名为demo.txt的文件,进行测试,结果如下:在这里插入图片描述在这里插入图片描述

  • 从结果可以看出,客户端成功接收了发送过来的数据,并创建了新的文件,但这里没有考虑当要下载的文件不存在时的情况,可以再对代码进行一些相应的优化。

TCP与UDP的区别

  • TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。

  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

  • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

  • 每一条TCP连接只能是点到点的:UDP支付一对一,一对多和多对一和多对多的交互通信。

  • TCP对系统资源要求较多,UDP对系统资源要求较少。

  • UDP通信在这里插入图片描述

  • TCP通信在这里插入图片描述

最后

以上就是美丽猫咪为你收集整理的socket UDP、TCP发送接收数据的全部内容,希望文章能够帮你解决socket UDP、TCP发送接收数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部