、bind(0) 端口号分配的奇偶性分析 如何修复 TCP 自连接的代码 背景说明,这个 PR 是什么 复现的代码如下,getAvailablePort() 用于寻找一个可用的偶数的端口号,测试例子中返回的是...TCP 自连接 TCP 的自连接是一个比较有意思的现象,甚至很多人认为是 Linux 内核的 bug。我们先来看看 TCP 的自连接是什么。.../proc/sys/net/ipv4/ip_local_port_range 文件指定了临时端口号的下界 low 和上界 high,默认情况,low 是偶数,在我的电脑上 low 和 high 的值分别是...connect 临时端口号的奇偶性分析 connect 临时端口号的分配源码在 __inet_hash_connect 中实现 可以看到,与 bind(0) 正好相反,它将 offset 通过下面这种方式强制变为了偶数...if fd.laddr == nil || fd.raddr == nil { return true } l := fd.laddr.(*TCPAddr) r := fd.raddr.
Python基础知识(28):常用第三方模块 一、Pillow PIL(Python Imaging Library):提供了强大的图像操作功能,可以通过简单的代码完成复杂的图像处理,是Python平台事实上的图像处理库...DOCTYPE HTML>\n\n\n<meta name="description" content="提供图书、电影、音乐唱片<em>的</em>推荐、评论<em>和</em>...' (2)发送POST请求...print(s) 结果: {'encoding': 'ascii', 'confidence': 1.0, 'language': ''} 检测出<em>的</em>编码<em>是</em>ascii,注意到还有个confidence字段...,表示检测<em>的</em>概率<em>是</em>1.0(即100%) 检测GBK编码<em>的</em>中文 import chardet data = '人生苦短,我学Python'.encode('gbk') s = chardet.detect...,可以跨平台使用,支持Linux/UNIX/OSX/Windows等,<em>是</em>系统管理员<em>和</em>运维人员不可或缺<em>的</em>必备模块 (1)安装psutil 如果安装了Anaconda,psutil就已经可用了。
Reactor模型简介 我们在开始netpoll框架的源码分析前,方便大家阅读源码有一个更好的体验,先简单的回顾下网络编程中的Reacor模型吧。...同时可以采用其提供的client方法可以和server进行交互。下面是client和server的一个完整的交互过程。...这部分在netpoll中是在pollmanager模块实现的,我们在3.4节中给大家介绍 3.3 初始化新的client连接 下面是connection的init()方法源码实现,我们继续研究内部的实现逻辑...PollRW2R PollEvent = 0x6 ) 看完Poll接口的定义后,我们以epoll的实现为例进行源码的分析,kqueue的封装和epoll大同小异,读者对kqueue感兴趣的话可以自行阅读源码...其实内部实际上是写到缓冲区中,然后当客户端状态达到可写时进行写出。 下面简单再介绍下connection的Write()和Flush()方法的实现。
这样的话,如果我们的服务需要同时提供 IPv4 和 IPv6 的访问能力,只需要监听一个 IPv6 的 socket 即可。...显然这个是 Golang 自身的行为。...通过追踪 Golang 的源码,问题最终定位在了这里 src/net/ipsock_posix.go : func favoriteAddrFamily(network string, laddr, raddr...nil || laddr.family() == syscall.AF_INET) && (raddr == nil || raddr.family() == syscall.AF_INET...自己定制需要的 net.Listen() listen 完整的 IPv4 和 IPv6 地址 插曲 如果你用 Chrome 访问 http://localhost:6666 这样的地址,可能会看到 ERR_UNSAFE_PORT
= "127.0.0.1",3999 client.connect(raddr) #connect方法会自动分配一个本地的UDP地址,和设置UDP的链接对象raddr地址 logging.info(client...UDP编程中bind、connect、send、sendto、recv、recvfrom方法使用 UDP的socket对象创建后,是没有占用本地地址和端口的。...方法 说明 bind(laddr) 可以指定本地地址和端口laddr,会立即占用,laddr为一个元组,(ip,prot) connect(raddr) 会随机分配一个本地的端口laddr,会绑定远端地址和端口...raddr,raddr是个元组,(ip,prot) sendto(msg,raddr) 可以立即占用本地地址和端口laddr,并把数据发往指定远端。...raddr#远端地址和端口组成的一个元组(ip,prot) send(msg) 需要和connect方法配合,可以使用已经从本地端口把数据发往raddr指定的远端msg#需要发送的消息bytes类型 recv
该函数根据tcp数据包中的目的端口和ip,源端口和ip找到一个最匹配的socket sk = get_sock(&tcp_prot, th->dest, saddr, th->source, daddr...socket和sock结构体是互相指向的。tcp维护了一个哈希链表,以监听的端口号为因子进行哈希。...等收到客户端的ack的时候,在tcp_ack中完成第三次握手。...,而数据通信的sock的receive_queue中的节点是通信的数据。...我们知道的第二点是多个客户端或者连接,是如何在一个监听的sock中完成tcp的建立,又是从监听的sock中过渡到数据通信sock,最后在新加的sock中完成数据通信的。
系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等。主要用于系统监控。对于系统维护来说是个不错的模块。...目前支持32位和64位的linux、windows、OS X、FreeBSD和Sun Solaris等操作系统。...laddr:本地地址作为命名元组或 AF_UNIX套接字的情况。对于UNIX套接字,请参阅下面的注释。(ip, port)path raddr:远程地址是指定的元组,或者是UNIX套接字的绝对地址。...(ip, port)path"" status:表示TCP连接的状态。 pid:打开套接字的进程的PID,如果是可检索的,否则None。...: 1>, laddr=addr(ip='0.0.0.0', port=3306), raddr=(), status='LISTEN')] In [16]: p.num_threads() #进程开启的线程数
简介 go针对不同的操作系统,其网络io模型不同,可以从go源码目录结构和对应内容清楚的看到各平台的io模型,如针对linux系统实现的epoll,针对windows操作系统实现的iocp等,这里主要看针对...netFD 服务端通过Listen方法返回的Listener接口的实现和通过listener的Accept方法返回的Conn接口的实现都包含一个网络文件描述符netFD,netFD中包含一个poll.FD...数据结构,而poll.FD中包含两个重要的数据结构Sysfd和pollDesc,前者是真正的系统文件描述符,后者对是底层事件驱动的封装,所有的读写超时等操作都是通过调用后者的对应方法实现的。...socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr) } listenTCP函数,在此函数中终于见到了期望看到的fd字眼,跳到...剩下的read,write大致相同,这里不再分析,最终都是通过netpoll的相关函数实现的,可以说整个核心实现都在netpoll.go这个文件中,外面只是进行了一些封装和状态的处理,至于G状态的变化的相关代码
sysmon:golang中的监控协程,会周期性检查就绪socket TODO: 为什么是在这些地方检查socket就绪事件呢?...此时返回的是哪个协程就绪呢? 一个socket fd可支持并发读写,因为对于tcp协议来说,是全双工。读写操作的是不同缓冲区,但是不支持并发读和并发写,因为这样会错乱的。...网络编程中的所有socket fd都是通过netFD对象实现的,netFD是对网络IO操作的抽象,linux的实现在文件net/fd_unix.go中。...netFD的Write方法和Read的实现原理是一样的,都是在碰到EAGAIN错误的时候将当前goroutine给park住直到socket再次可写为止。...本文只是将网络库的底层实现给大体上引导了一遍,知道底层代码大概实现在什么地方,方便结合源码深入理解。
实现函数定义在src/net/tcpsock_posix.go中 return laddr.family(), false } //如果未指定本端和远端地址或明确指定了本端和远端需要的地址类型为...服务端需要确保本地监听地址非nil(但可以为""),否则会被认为是一个客户端socket。ListenTCP中已经对laddr赋初值 21 if laddr !...可以参见golang中的锁源码实现:Mutex //此处表示该文件锁的引用计数为0且已经关闭,释放文件锁,退出Close函数(其他地方可以进行如readUnlock/writeUnlock操作)...pollDesc结构体中的rg和wg比较难理解,它们与netpoll相关,将底层缓存区的读写情况反映为当前读写对应的goroutine的状态。...runtime.epollwait是在runtime.netpoll中调用的,而runtime.netpoll的是在单独的线程中运行的。
. 0x01:漏洞影响 在安卓8.0到9.0系统中,在蓝牙开启的情况下,远程攻击者在一定距离范围内可以以蓝牙守护程序的权限静默执行任意代码。...在安卓10系统中,该漏洞无法被利用,但可能会引发蓝牙守护进程奔溃。 低于安卓8.0的版本中也受到该漏洞的影响,但研究人员没有评估该影响。 研究人员强烈建议用户安装官方2月份发布的补丁。...如果无法安装补丁或设备不再支持,可以尝试一些通用的方法: 非必需情况下不开启蓝牙。需要注意的是大多数蓝牙耳机都支持有线模拟音频。 设置设备蓝牙为不可见。只有当在蓝牙扫描菜单中设置后设备才是可见的。...但一些老版本的手机可能设置的是一直可见。..., raddr; laddr.l2_family = AF_BLUETOOTH; laddr.l2_bdaddr = di.bdaddr; laddr.l2_psm = htobs
net 包中定义了以下基本接口type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int,...SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error}IP主要类型net.IP用 string 创建 net.IP 对象,它实际是一个...[]byte 类型ip := net.ParseIP("127.0.0.1")net.IPAddr创建 net.IPAddr 对象,是 net 包中许多函数和方法的操作对象ipAddr := net.IPAddr..., raddr *IPAddr) (*IPConn, error) // exampleremoteAddr := net.IPAddr{ IP: net.ParseIP("1.2.3.4")..., raddr *TCPAddr) (*TCPConn, error)func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)控制
对于监听型的socket,是没有目的ip和目的端口的。通信型的socket才有。所以上面的函数根据服务端绑定的ip和端口。判断是否等于tcp报文中的目的ip和端口。最后拿到监听型的sock结构体。...最后发送ack完成第二次握手。 ? 我们继续来看第三次握手。前面说过tcp_rcv是处理tcp数据包的。所以我们还是回到这个函数。...三次握手的过程中,第一次握手的时候,在监听型的sock结构体的接收队列里插入了一个sock节点。在第三次握手的时候,修改这个sock状态为已连接。...我们看看accept函数是怎么摘取这个队列中的节点的。...另外监听型socket和通信型socket他的接收队列意义是不一样的,前者是已完成连接或者正在建立连接的队列,后者是数据包队列。
前期准备 ---- 需要import "net"包 IP类型,其中一个重要的方法是IP.ParseIP(ipaddr string)来判断是否是合法的IP地址 TCP Client ---- func...) Read(b []byte) (n int, err os.Error)用于接收数据,返回接收的长度或者返回错误,是TCPConn的方法 TCPAddr类型,保存TCP的地址信息,包括地址和端口..., laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)用来连接(connect)到远程服务器上,net表示协议方式,tcp,tcp4或者tcp6,laddr...表示本机地址,一般为nil,raddr表示远程地址,这里的laddr和raddr都是TCPAddr类型的,一般是上一个函数的返回值。...*TCPAddr) (l *TCPListener, err os.Error)用来监听端口,net表示协议类型,laddr表示本机地址,是TCPAddr类型,注意,此处的laddr包括端口,返回一个
实际上,Dial()函数是对DialTCP()、DialUDP()、DialIP()、DialUnix()函数的封装: func DialTCP(net string, laddr, raddr *TCPAddr...) (c *TCPConn, err error) func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err error) func...DialIP(netProto string, laddr, raddr *IPAddr) (c *IPConn, err error) func DialUnix(net string, laddr..., raddr *UnixAddr) (c *UnixConn, err error) 下面是一个TCP示例程序: func checkError(err error) { if err !...Go语言的大多数类型都可以转化为有效的JSON文本,但channel、complex和函数这几种类型除外;而对于指针,会转化为指针所指向的值,如果指针指向的是零值,那么null将作为转化后输出的结果。
func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) 用来链接远程服务器。...net 可以是 tcp、tcp4、tcp6 中的一个。Laddr 为本地地址,通常 传 null,raddr 是要链接的远端服务器的地址。...但如果客户端发送数据 后,没有关闭,而是等待服务端的数据返回,用 ReadAll 是不行的。所以在上面的例子中, 用 0 来示数据的发送完成。...因为 UDP 不是面向链接的,所 以资源消耗小,处理速度快,通常音频、视频和普通数据在传送时使 UDP 较多。如 QQ 使 用的就是 UDP 协议。...func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error) 连接到远端服务器 raddr,net 参数必须是”udp”,”udp4
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本文就来简单谈谈 TCP 的三次握手和四次挥手。...Q/A 为什么建立连接是三次握手,而关闭连接却是四次挥手呢? 这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。...为什么建立连接要三次握手? 目的: 防止已经失效的连接请求到达服务端,创建无效的连接,浪费资源。...SYN 攻击 在三次握手过程中,服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前的 TCP 连接称为半连接 (half-open connect)。...检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击 为什么 TIME_WAIT 状态需要经过 2MSL (最大报文段生存时间
此脚本可以用来统计某个端口上连接的IP的数量,统计连接到这一端口的所有IP、最多的IP和次数以及TCP连接状态。 涉及到Python读取网络连接统计信息以及统计计算的一些基本操作。...在编写脚本的过程中预先定义了统计信息的数据结构,在向最终结果中添加统计信息时需要用到list去重功能,因此临时创建了一个列表使用set()函数去重。...set()函数不能直接add字典类型,因此先将字典转成可哈希的字符串,再将去重后的字符串转成字典。其中字典、列表和集合都属于不可哈希的类型。 ...eval(member)) # add statistics data for each ip address for sconn in netstat: if port in sconn.laddr...: if len(sconn.raddr) !
var ( icmp ICMP laddr = net.IPAddr{IP: net.ParseIP("0.0.0.0")} raddr, _ = net.ResolveIPAddr("ip...", os.Args[1]) ) conn, err := net.DialIP("ip4:icmp", &laddr, raddr) if err !...目的地址raddr是一个URL,这里使用Resolve进行DNS解析,注意返回值是一个指针,所以下面的DialIP方法中参数表示没有取地址符。...检验和算法参考上面给出的URL中的实现: ?...总结 Golang实现整个Ping比我想象中的还要简单很多,静态编译速度是十分快速,相比C而言,你需要更多得了解底层,甚至要从链路层开始,你需要写更多更复杂的代码来完成相同的工作,但究其根本,C语言仍然是鼻祖
领取专属 10元无门槛券
手把手带您无忧上云