【python高级】341-计算机网络基础 for Socket网络编程
ip地址
IP地址就是标识网络中设备的一个地址,好比现实生活中的家庭地址。
ip地址分为ipv4(如:10.21.127.9)和ipv6(如:fe80:78a0:17e7:fef7:52dc%16),主流用ipv4
ipv4由点分十进制组成
ipv6由点分十六进制组成
查看ip地址:
- windows:cmd:
ipconfig
- linux:bash:
ifconfig
计算机中一般由两个IP地址:
- 上网IP地址:
192.168.1.222
- 本地回环IP:
127.0.0.1
(for 本地测试)
检测网络是否能连通(连通性):
cmd:ping <目标机器ip/网址>
端口
由ip只能找到计算机,通信需要通过端口
每运行一个网络程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可
端口号分类
- 知名端口号
- 知名端口号是指众所周知的端口号,范围从0到1023。
- 这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务。
- 动态端口号
- 一般程序员开发应用程序使用端口号称为动态端口号,范围是从1024到65535
- 如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
注:当运行一个程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放。
传输控制协议
数据传输要遵循数据传输协议 -> TCP/UDP
TCP概念
TCP的英文全拼(TransmissionControlProtocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信步骤:①创建连接②传输数据③关闭连接
[!NOTE]- ## TCP特点
面向连接
- 建立连接:在数据传输之前,需要通过三次握手来建立连接。客户端先向服务器发送 SYN 报文请求连接,服务器收到后回复 SYN + ACK 报文表示同意连接并进行同步,客户端再发送 ACK 报文确认连接,完成三次握手后才开始正式传输数据,这种方式确保了连接建立的可靠性124.
- 释放连接:数据传输结束后,需要通过四次挥手来释放连接。主动关闭方发送 FIN 报文通知对方自己不再发送数据,对方收到后回复 ACK 报文确认,此时主动关闭方进入半关闭状态,只能接收数据不能发送数据;当对方也没有数据要发送时,会发送 FIN 报文给主动关闭方,主动关闭方回复 ACK 报文确认,连接彻底释放15.
可靠性高
- 数据编号与确认:为每个字节的数据分配唯一的序列号,接收方根据序列号对收到的数据进行确认和排序。接收方成功收到数据后会向发送方发送确认号,告知发送方已正确接收的数据范围,发送方如果在合理的往返时延内未收到确认,就会重传相应的数据,确保数据不丢失、不重复、不错乱124.
- 校验和检验:通过校验和函数对数据进行校验,在发送和接收时都计算校验和,用于检测数据在传输过程中是否发生错误。如果收到的数据校验和有差错,接收方将丢弃该数据,并通知发送方重发24.
基于字节流
- 字节序列传输:将应用层交下来的字节流数据无结构地传输到网络层,数据在传输过程中被看作是连续的字节序列,而不关心数据的具体格式和含义。在接收端,会按照字节流的顺序将数据重组后交给应用层,这种方式使得 TCP 能够适应各种不同类型的数据传输需求,如文本、图像、音频、视频等3.
提供全双工通信
- 双向数据传输:允许通信双方同时进行数据的发送和接收,即一端既可以作为客户端向对方发送数据,也可以作为服务器接收对方发送的数据,双方的数据传输相互独立,互不干扰,提高了通信效率5.
流量控制
- 滑动窗口机制:通过滑动窗口来实现流量控制,接收方根据自己的接收能力和处理速度,在 TCP 报文中通告一个窗口大小,告知发送方自己能够接收的数据量。发送方根据接收方的窗口大小来调整发送数据的速率,避免发送过快导致接收方缓冲区溢出,从而保证数据的可靠传输,提高网络资源的利用率124.
拥塞控制
- 多种算法结合:采用慢启动、拥塞避免、快速重传和快速恢复等多种拥塞控制算法来调节发送方的拥塞窗口,根据网络的拥塞程度动态调整发送方的发送速率,防止网络出现恶性拥塞,确保网络的稳定性和可靠性。例如,在慢启动阶段,拥塞窗口初始化为一个报文段,每收到一个确认就加倍增长,快速探测网络的可用带宽;当拥塞窗口超过慢启动阈值后进入拥塞避免阶段,拥塞窗口线性增长,避免网络拥塞;快速重传和快速恢复机制则能够在数据包丢失时快速重传丢失的报文段,并调整拥塞窗口,减少数据传输的延迟
UDP协议(不可靠,速度快)
延迟低、速度快、不可靠:对数据质量要求不高,只对速度要求
[!NOTE]- ## UDP 协议特点
无连接性
- UDP 在发送数据之前不需要与接收方建立连接,就像发送短信一样,只要知道对方的 IP 地址和端口号,就可以直接发送数据报,无需像 TCP 那样进行三次握手来建立连接,大大减少了数据传输的延迟,提高了通信效率13.
低开销
- 由于 UDP 没有复杂的连接建立和维护机制,不需要像 TCP 那样跟踪大量的状态信息,如确认序号、窗口大小等,因此在实现 UDP 协议时,系统资源的消耗相对较少,协议头也比较简单,通常只有 8 字节,这使得 UDP 的传输效率更高,尤其适用于对实时性要求高、数据量较小且对可靠性要求不高的应用场景1.
不可靠性
- UDP 不提供数据传输的可靠性保证,数据在传输过程中可能会出现丢失、重复或者乱序的情况。它只是尽力将数据报发送出去,而不会对数据的传输结果进行确认和重传。接收方也不会向发送方反馈数据是否正确接收,因此应用层需要自行处理数据丢失、重复等问题,对于一些对数据准确性要求极高的场景,如文件传输等,UDP 可能不太适用,但对于一些实时性要求高且能够容忍少量数据丢失的场景,如视频直播、音频通话等,UDP 则具有优势123.
面向数据报
- UDP 是面向数据报的传输协议,应用层数据被封装成一个个独立的数据报进行发送。每个 UDP 数据报都有自己的长度、校验和等信息,接收方收到的数据报就是发送方发送的原始数据报,不会对数据进行合并或者拆分,这与 TCP 基于字节流的传输方式有所不同,在处理一些对数据完整性要求较高的简单数据报时比较方便2.
支持广播和多播
- UDP 支持广播和多播操作,这是其一大特色。广播是指将数据发送到网络中的所有主机,而多播则是将数据发送到网络中的一组特定主机。通过广播和多播,UDP 能够实现一对多的通信模式,在一些特定的网络应用中非常有用,如视频会议、在线游戏等场景中,可以方便地将数据同时发送给多个接收者1.
缺乏流量控制和拥塞控制
- UDP 协议本身不具备流量控制和拥塞控制机制,发送方可能会以很高的速率发送数据,而不顾及接收方的接收能力和网络的拥塞状况。这可能导致接收方处理不过来而丢失数据,或者在网络拥塞时加剧网络的堵塞情况,但在某些特定场景下,如对实时性要求极高的应用中,这种特性也可以避免因拥塞控制等机制带来的额外延迟13.
socket套接字工具
TCP网路编程也叫套接字编程
到目前为止我们学习了IP地址和端口号还有TCP传输协议,为了保证数据的完整性和可靠性我们使用TCP传输协议进行数据的传输,为了能够找到对应设备我们需要使用IP地址,为了区别某个端口的应用程序接收数据我们需要使用端口号,那么通信数据是如何完成传输的呢?
socket(简称套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行进程之间想要进行网络通信需要基于这个socket。
socket的作用与应用场景
socket的作用:负责进程之间的网络数据传输,好比数据的搬运工。
socket使用场景:|
不夸张的说,只要跟网络相关的应用程序或者软件底层都使用到了socket。
TCP协议和UDP协议的对比
- TCP 协议和 UDP 协议的区别
- 连接方式
- TCP:是面向连接的协议。在数据传输之前,需要通过三次握手建立连接,传输结束后通过四次挥手来释放连接,这个过程保证了通信双方能够可靠地传输数据。
- UDP:是无连接的协议。发送数据之前不需要建立连接,只要知道对方的 IP 地址和端口号就可以直接发送数据,这样减少了建立和释放连接的开销,但也意味着数据传输的可靠性较低。
- 可靠性
- TCP:可靠性高。它通过序列号、确认号、校验和等机制来保证数据的有序、无差错传输。如果数据在传输过程中丢失或者损坏,接收方会要求发送方重传数据。
- UDP:不保证数据传输的可靠性。它只是尽力将数据发送出去,数据可能会出现丢失、重复或者乱序的情况,接收方不会对发送方进行确认,发送方也不会知道数据是否被正确接收。
- 传输方式
- TCP:基于字节流的传输方式,将应用层的数据看作是无结构的字节序列进行传输,它会对字节流进行编号和排序,在接收端按照顺序重组字节流并交给应用层。
- UDP:基于数据报的传输方式,应用层数据被封装成一个个独立的数据报进行发送,每个 UDP 数据报都有自己的长度、校验和等信息,接收方收到的数据报就是发送方发送的原始数据报,不会对数据进行合并或者拆分。
- 传输效率
- TCP:由于需要建立连接、进行可靠性保证等操作,其协议头相对复杂,数据传输过程中的开销较大,传输效率相对较低。不过在网络环境较好的情况下,通过滑动窗口等机制可以实现高效传输。
- UDP:协议头简单,没有复杂的连接建立和维护机制,也不需要进行大量的确认和重传操作,因此传输效率高,但是在网络质量较差的情况下,可能需要应用层自己来实现数据的可靠性保证。
- 流量控制和拥塞控制
- TCP:具备完善的流量控制和拥塞控制机制。通过滑动窗口进行流量控制,防止接收方缓冲区溢出;利用多种拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复)来避免网络拥塞,确保网络的稳定性和可靠性。
- UDP:没有流量控制和拥塞控制机制。它只是简单地发送数据报,不会根据网络的情况和接收方的状态来调整发送速率,这可能会导致网络拥塞或者接收方无法处理过多的数据。
- 连接方式
- 真实业务场景中的使用区别
- 文件传输场景(适合 TCP)
- 需求分析:在文件传输过程中,数据的完整性和准确性是至关重要的。用户希望文件能够完整无误地从源端传输到目的端,并且能够知道传输的进度。
- TCP 优势:TCP 的可靠性机制可以保证文件数据的正确传输。例如,在使用 FTP(文件传输协议)传输文件时,TCP 通过序列号和确认号来确保每个字节的数据都能准确到达目的地。如果在传输过程中出现数据丢失或者错误,接收方可以通过序列号告知发送方重传相应的数据部分。同时,TCP 的流量控制机制可以根据接收方的缓冲区情况调整发送速度,避免接收方因为来不及接收而导致数据丢失。
- 视频直播场景(适合 UDP)
- 需求分析:视频直播对实时性要求很高,用户可以接受少量的数据丢失,但不能忍受较大的延迟。即使丢失了一些视频帧,只要不影响整体的观看体验即可。
- UDP 优势:UDP 的传输效率高、延迟小,能够满足视频直播实时性的要求。例如,在一些实时视频直播平台中,使用 UDP 协议传输视频流。由于 UDP 不需要建立连接和进行复杂的可靠性保证,数据可以快速地发送出去,减少了延迟。虽然可能会出现少量视频帧丢失的情况,但因为视频本身具有一定的冗余信息,并且人的视觉对于少量帧丢失不太敏感,所以 UDP 协议在这种场景下是比较合适的选择。
- 电子邮件发送场景(适合 TCP)
- 需求分析:电子邮件内容包括文字、附件等,需要保证邮件内容完整、准确地发送到邮件服务器并存储。发送过程中的数据丢失或者错误可能会导致邮件信息不完整或者无法正常发送。
- TCP 优势:TCP 的可靠性保证能够满足电子邮件发送的需求。例如,SMTP(简单邮件传输协议)使用 TCP 协议,在发送邮件时,通过 TCP 的三次握手建立连接后开始传输邮件内容,发送方会收到接收方的确认信息,确保邮件数据完整地传输到邮件服务器,保证了邮件发送的准确性和完整性。
- DNS 查询场景(适合 UDP)
- 需求分析:DNS(域名系统)查询主要是将域名转换为对应的 IP 地址,需要快速地获取查询结果,并且查询数据量相对较小。对于一次 DNS 查询来说,少量的数据丢失可以通过重新查询来解决。
- UDP 优势:UDP 的高效传输特性使得 DNS 查询能够快速得到响应。由于 UDP 不需要建立连接的过程,所以查询请求可以更快地发送到 DNS 服务器,并且服务器的响应也能快速返回给客户端。虽然 UDP 可能会出现数据丢失的情况,但 DNS 查询本身具有幂等性,即重复查询不会对结果产生影响,所以即使丢失了一次查询请求,重新查询即可,不会对系统产生严重的后果。
- 文件传输场景(适合 TCP)