首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python网络编程-一文厘清socket、TCP和UDP那点事

发送UDP消息sock.getpeername()连接到套接字的远程地址sock.getsockname()获取当前套接字地址sock.getsockopt()获取给定套接字选项的值sock.shutdown...控制套接字的模式面向阻塞的套接字方法sock.setblocking()设置套接字的阻塞或非阻塞模式sock.gettimeout()获取阻塞套接字操作的超时时间面向文件的套接字方法sock.fileno...TCP不是使用顺序的整数作为数据包的编号,而是通过一个计数器记录发送的字节数,且TCP初始序列号是随机选择的,这样可以避免TCP序号易于猜测而伪造数据进行欺骗或攻击。...比如包大小是2048字节,初始序号为3000,那么下一个数据包的序号是5048。 此外,TCP可以一次性发送多个数据包,无须按数据包依次发送。...') # 当有连接时,把收到的套接字存到client_sock,远程连接细节存到address中 client_sock, address = server_socket.accept

1.4K20

JavaScript 是如何工作的:深入网络层 + 如何优化性能和安全

这种情况经常发生,因为所有资源都需要从网上获取,然后才能解除其余步骤的阻塞。为了使网络层高效,它需要扮演的角色不仅仅是一个简单的套接字管理器。...本质上,当用户开始与浏览器交互时会发生以下情况: 用户在浏览器地址栏中输入一个 URL 给定 Web 上资源的 URL,浏览器首先检查其本地缓存和应用程序缓存,并尝试使用本地副本来完成请求 如果缓存不能使用...然后数据包被传递给 IP 层,IP 层的主要任务是找出一种将数据包从用户发送到远程服务器的方法,这些信息也存储在包的顶部 数据包被发送到远程服务器 一远程服务器一旦接收到数据包,就会以类似的方式发回响应...实际上,现代浏览器在将请求管理周期与套接字管理分离方面做了更多的工作。套接字组织在按源分组的池中,每个池执行自己的连接限制和安全约束。挂起的请求被排队、排序,然后绑定到池中的各个套接字。...浏览器可以优化所有套接字的带宽分配,也可以在预期请求时打开套接字。 正如之前提到的,这一切都由浏览器管理,不需要我们做任何工作,但这并不意味着我们什么都做不了。

81330
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ Qt开发:QUdpSocket网络通信组件

    这些函数提供了在 UDP 通信中使用 QUdpSocket 的各种功能,包括绑定、发送和接收数据报、设置和获取套接字的状态等。...如果提供了 parent 参数,则会将新创建的 QUdpSocket 对象添加到 parent 对象的子对象列表中,并且在 parent 对象被销毁时自动销毁 QUdpSocket 对象。...单播(Unicast)单播是一种一对一的通信方式,其中数据包从一个发送者传输到一个接收者。在单播通信中,数据包只发送到目标主机的网络接口,并且只有目标主机能够接收和处理这个数据包。...在广播通信中,数据包被发送到网络中的所有主机,并且所有的主机都能够接收和处理这个数据包。一对多通信:每个数据包有一个发送者,但可以有多个接收者。...目标不明确:数据包被发送到网络中的所有主机,不需要知道接收者的具体地址。广播域:在局域网中进行广播,只有在同一广播域内的主机才能接收到广播消息。

    39412

    C++ Qt开发:QUdpSocket网络通信组件

    这些函数提供了在 UDP 通信中使用 QUdpSocket 的各种功能,包括绑定、发送和接收数据报、设置和获取套接字的状态等。...如果提供了 parent 参数,则会将新创建的 QUdpSocket 对象添加到 parent 对象的子对象列表中,并且在 parent 对象被销毁时自动销毁 QUdpSocket 对象。...单播(Unicast) 单播是一种一对一的通信方式,其中数据包从一个发送者传输到一个接收者。在单播通信中,数据包只发送到目标主机的网络接口,并且只有目标主机能够接收和处理这个数据包。...在广播通信中,数据包被发送到网络中的所有主机,并且所有的主机都能够接收和处理这个数据包。 一对多通信:每个数据包有一个发送者,但可以有多个接收者。...目标不明确:数据包被发送到网络中的所有主机,不需要知道接收者的具体地址。 广播域:在局域网中进行广播,只有在同一广播域内的主机才能接收到广播消息。

    36910

    14.11 Socket 基于时间加密通信

    在之前的代码中我们并没有对套接字进行加密,在未加密状态下我们所有的通信内容都是明文传输的,这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密,此处笔者将演示一种基于时间的加密方法,该加密方法的优势是数据包每次发送均不一致...代码中函数GenRandomString用于实现生成一个随机数,该函数接受一个随机数长度并返回一个字符串。...最后将加密数据包发送出去,并接着计算该数据包的CRC32值,并再次通过send()函数将其发送给客户端。...std::cout << std::endl; return pack->Buffer; } } 14.11.4 数据加密收发 当有了上述完整加解密函数的封装之后读者就可以通过使用套接字的方法来实现数据包的通信...,当需要接收数据时可以直接调用RecvDecryptPage()函数并传入当前活动套接字,而如果需要发送数据则也只需要调用SendEncryptionPage()函数即可,由于函数已被封装所以在传输数据时与普通套接字函数的使用没有任何区别

    35820

    实战 | C++ Socket详解与研究

    ,本文尝试通过c++来进行套接字(socket)的实现 基础知识 Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。...read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取,如下图所示 这些I/O缓冲区特性如下: •I/O缓冲区在每个TCP套接字中单独存在;•I/O缓冲区在创建套接字时自动生成...;•即使关闭套接字也会继续传送输出缓冲区中遗留的数据;•关闭套接字将丢失输入缓冲区中的数据。...阻塞模式 对于TCP套接字(默认情况下),当使用 write()/send() 发送数据时: 1.首先会检查缓冲区,如果缓冲区的可用空间长度小于要发送的数据,那么 write()/send() 会被阻塞...使用 connect() 建立连接时,客户端和服务器端会相互发送三个数据包 客户端调用 socket() 函数创建套接字后,因为没有建立连接,所以套接字处于CLOSED状态;服务器端调用 listen

    1.8K30

    一道腾讯面试题目:没有listen,能否建立TCP连接

    为了能够收到TCP的握手数据包,可以尝试使用原始套接字来接收IP报文,这样就可以在应用层替代内核做TCP的三次握手了。这个想法不错,可惜现实比较残酷,七年前我已经试过这个方案了。...当没有对于TCP 套接字处于listen状态时,使用raw socket处理握手报文时,即使收到了syn报文并给对端发送了syn+ack报文,也无法完成连接。因为内核一般会提前发送RST中断该连接。...这时,可以使用iptables的NFQUEUE,在网络层将数据包取到应用层,并回复syn+ack,同时在reinject时通知内核该数据包被“偷”了,即NF_STOLEN。...只不过限定了条件之后,我们需要确定2个事情: 与前面类似,如何避免内核发送RST。在不能使用iptable的前提下,这意味着在tcp_v4_rcv中,要能够找到对应的套接字。...对于客户端来说,syn+ack报文必然可以在已连接表中匹配上对应的套接字。那么,对于本题目来说,要想两端都可以找到套接字,就要求在报文到达前,两端都调用了connect。

    2K30

    EternalBlueC:一款针对永恒之蓝的CC++实现工具

    这些NT传输包的格式不正确,这会在受害者计算机的内存中存在漏洞。更多的空白或空SMB数据包通过多个套接字发送到受害者的同一端口。...然后创建20个其他套接字,并将数据发送到这些套接字(套接字3到套接字21)中。之后,DoublePulsar后门通过插座3发送到插座21。...可能需要更多的利用尝试。然而,目前有一个错误,TreeID和UserID没有被正确的设置在数据包中,这将在以后的版本中修复。当TreeID和UserID设置为默认值时,这将适用于最近打开的计算机。...发送Trans2 SESSION SETUP请求数据包以获取Trans2 SESSION_SETUP响应数据包中的SMB签名。...发送Trans2 SESSION SETUP请求数据包以获取TRANS2 SESSION_SETUP响应数据包中的SMB签名。

    1.6K20

    网络编程初识和socket套接字

    包含:(最短46字节,最长1500字节) 数据包的具体内容 head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送 mac地址: head中包含的源和目标地址由来:ethernet...mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议 arp协议功能:广播的方式发送数据包,获取目标主机的mac地址 协议工作方式:每台主机ip...5 TCP协议 TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。...) # 创建客户套接字 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 sk.send(b'hello!')...发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完) s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时

    1.1K20

    socket实现TCPIP通信

    在使用TCP/IP协议时需要进行复杂的设置,每个结点至少需要一个“IP地址”、一个“子网掩码”、一个“默认网关”、一个“主机名”。...简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性。...而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求 1.2.3 socket()函数 对于C/C++,socket函数一般在WinSock2.h和WinSock.h库中,开发者可通过在头文件中声明...s.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...s.sendall() 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    2.2K20

    Linux中一个网络包的发送接收流程

    HTTP报文添加TcpHeader,并进行CPU copy写入套接字发送缓冲区,每个套接字会分别对应一个Send-Q(发送缓冲区队列)、Recv-Q(接收缓冲区队列),可以通过ss -nt语句获取当前的套接字缓冲区的状态...= 4 (2 + 2) 复制代码 发送窗口 我们在创建套接字的时候,通过SO_SENDBUF指定了发送缓冲区的大小,如果设置了大小为2048KB,则Linux在真实创建的时候会设置大小2048...,并在发包时检查当前缓冲区大小是否小于SO_SENDBUF指定的大小,如果不满足则阻塞当前线程,进行睡眠,等待发送窗口中有包被ACK后触发内存free的回调函数唤醒后继续尝试发送; 接收窗口(拥塞窗口)...;当用户进程获取后窗口的左端会向右移动,并触发回调函数将该数据包的内存free掉; RCV.WND 为未使用的,推荐返回给该套接字的客户端发送方当前剩余的可发送的bytes数,即拥塞窗口的大小; 第三部分为未使用的...网卡发送网络包:当sk_buff已经在内核空间被写入完成时,网卡的DMA Engine检测到Tx.ring有数据包完成时,触发DMA Copy将数据传输到网卡内存中,并封装MAC帧。

    2.1K30

    (十)Python网络编程

    IP地址和端口号,不清楚自己端口号的可以到C运行里面输入 cmd /k ipconfig,这样就可以找到自己的端口号了,之后获取需要传输的数据,发送,接收,再关闭套接字就好了。...广播         socket只需要发送1次UDP数据,就可以发送给本局域网中的任何一台电脑发送相同的数据 import socket # 创建UDP套接字 udp_socket = socket.socket...然后接收端实体对已成功收到的数据发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据就被假设为已丢失将会被进行重传。...错误校验:TCP用校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 流量控制和阻塞管理         流量控制用来避免主机发送得过快而使接收方来不及完全收下。...,否则客户端找不到这个服务器 TCP客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机 TCP服务器中通过listen可以将socket创建出来的主动套接字变为被动的

    57940

    Java利用UDP协议建立广播组通信【附通信源码】

    发送数据包的过程如下: 使用DatagramSocket()创建一个数据包套接字, 使用DatagramPacket(byte[] buf,int offset,int length,InetAddress...接下来分别说明一下在进行UDP协议传输时,常用的两个类: DatagramPacket类 DatagramPacket类位于Java.net包下,用来表示数据包。...第二种构造函数用于发送数据包,它不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口,在发送数据时必须指定接收方的Socket地址和端口号,使用第二种构造函数可以创建发送数据的DatagramPacket...DatagramSocket类 DatagramSocket类位于java.net包中,它用于表示接收和发送数据包的套接字,该类有以下的构造函数: DatagramSocket() DatagramSocket...在进行程序的接收时,必须指定一个端口号,不允许系统随机生成,此时可以使用第二种构造函数,就像你去发快递收货地址必须指定是一样的,在发送程序时通常使用第一种构造函数,不需要指定端口号,这就像发快递不管去哪一个快递公司都可以

    1.6K30

    UDP协议支持广播发送数据_tcp协议建立连接的过程

    发送数据包的过程如下: 使用DatagramSocket()创建一个数据包套接字, 使用DatagramPacket(byte[] buf,int offset,int length,InetAddress...接下来分别说明一下在进行UDP协议传输时,常用的两个类: DatagramPacket类 DatagramPacket类位于Java.net包下,用来表示数据包。...第二种构造函数用于发送数据包,它不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口,在发送数据时必须指定接收方的Socket地址和端口号,使用第二种构造函数可以创建发送数据的DatagramPacket...DatagramSocket类 DatagramSocket类位于java.net包中,它用于表示接收和发送数据包的套接字,该类有以下的构造函数: DatagramSocket() DatagramSocket...在进行程序的接收时,必须指定一个端口号,不允许系统随机生成,此时可以使用第二种构造函数,就像你去发快递收货地址必须指定是一样的,在发送程序时通常使用第一种构造函数,不需要指定端口号,这就像发快递不管去哪一个快递公司都可以

    1.7K10

    以非侵入方式构建Kubernetes应用程序的网络拓扑

    在 openEuler 生态系统中,这样的工具是 gala-gopher,它提供大量不同的探针,包括套接字、TCP 和 L7/HTTP(s) 探针。...现在,这些指标是在套接字级别收集的,这意味着它们正是应用程序进程可以看到的内容。收集是通过 eBPF 探针完成的,因此第一个想法是检查操作系统内核是否比套接字中可用的信息更了解应用程序连接。...理想的位置是网络堆栈中内核中的某个位置,它位于所谓的套接字缓冲区(表示网络连接信息的结构)中,从顶级一直到准备好通过网络传输的数据包。从实现的角度来看,代码应该是 eBPF 代码(当然!)...这是客户端与后端应用程序建立连接时发送的 TCP SYN 数据包。...在创建 TCP 数据包时,会调用 TCP header 回调。此操作发生在地址转换前,因此我们可以将套接字源地址复制到头部选项中。

    14510

    后端面试总结-网络篇

    ,考虑到在TCP/IP各层中,只有传输层有重传机制,在传输过程中,分段发生丢失、损坏时,可以通过TCP的重传机制保证接收方能收到完整的数据包,所以分段的工作应该由传输层完成。...,任何读操作都会返回异常; 输出方向上,内核会尝试将发送缓冲区的数据发送给对端,之后发送fin包结束连接,这个过程中,往套接字写入数据都会返回异常。...若对端还发送数据过来,会返回一个rst报文❞ ⚠️套接字会维护一个计数,当有一个进程持有,计数加一,close调用时会检查计数,只有当计数为0时,才会关闭连接,否则,只是将套接字的计数减一❞ ❝「int...❞ ⚠️shutdown不会检查套接字的计数情况,会直接关闭连接❞ 四次挥手 ❝「为什么需要在TIME_WAIT等待一段时间」 避免新连接(使用同一个五元组的连接)收到旧连接的数据包,造成数据混乱 保证在...客户端生成一个随机数,用上一步证书中的公钥进行加密,并将加密后的信息发送给服务端 服务端获取后,通过私钥进行解密,获取到随机数 客户端和服务端通过随机数进行对称加解密

    83340

    12 . Python3之网络编程

    而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。...mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议 arp协议功能:广播的方式发送数据包,获取目标主机的mac地址 协议工作方式:每台主机ip...,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv() 接收TCP数据 s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时...s.sendall() 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...这些I/O缓冲区特性可整理如下: 1.I/O缓冲区在每个TCP套接字中单独存在; 2.I/O缓冲区在创建套接字时自动生成; 3.即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 4.关闭套接字将丢失输入缓冲区中的数据

    1K40

    SeedLab——TCPIP Attack Lab

    AF_INET参数指定了使用IPv4协议,SOCK_RAW参数指定了套接字类型为原始套接字,IPPROTO_TCP参数指定了传输层协议为TCP。如果socket函数返回值为-1,表示创建套接字失败。...通过setsockopt函数设置套接字选项。setsockopt函数用于设置套接字的各种选项,这里使用IP_HDRINCL选项来告诉操作系统在发送数据时不自动添加IP头部。...然后使用sendto函数将我们自己构造的SYN数据包通过创建的原始套接字发往目标地址。...SYN Cookie通过在服务器端动态生成伪随机的序列号来替代实际的半连接队列,从而减轻服务器的负载。服务器将伪随机序列号编码到SYN-ACK响应中,并将其发送给客户端。...客户端在收到SYN-ACK响应时,会解码其中的伪随机序列号并发送ACK以完成连接的建立。这样,服务器不再需要维护实际的半连接队列,而是根据客户端发送的ACK来重构连接状态。

    70010

    CS 144 Lab Seven -- putting it all together

    例如,AF_INET 表示 IPv4 地址族,AF_UNIX 表示本地套接字(Unix 域套接字)。这个参数决定了套接字将在哪种网络层协议上工作。 type: 套接字的类型,指定了套接字的通信方式。...例如,SOCK_STREAM 表示流式套接字(用于 TCP),SOCK_DGRAM 表示数据报套接字(用于 UDP)。这个参数决定了套接字将如何进行数据传输。...这是因为 TUN 设备在内核中被实现为一个虚拟网络设备,有关于其属性的信息可以通过套接字选项来获取。 在这个情境下,getsockopt 调用用于获取 TUN 设备的协议域和类型。...: 从网络接收到udp数据包,并从udp数据包的payload中获取以太网帧,然后将以太网帧传送给Router,经过一系列步骤后,最终回显到屏幕的整个过程如下: 有一点需要注意,我们最终是借助本机...linux操作系统提供的udp socket完成数据包的发送,并且该udp数据包的payload载荷是我们封装好的以太网帧: 此时,我们在来回看一开始给出的这张协作图,或许就没有那么难以理解了:

    21740
    领券