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

图解 | 当我们在读写 Socket 时,我们究竟在读写什么?

简单过程 当客户端和服务器使用TCP协议进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接socket将字节数组发送到服务器,服务器通过套接socket读取到字节数组...,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接将自己数组发送给客户端,客户端通过套接socket读取到自己数组,再反序列化成响应对象...在互联网技术服务行业工作多年经验告诉,如果你对底层机制不了解,你就会不明白为什么套接socket读写会出现各种奇奇乖乖问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题...对于这些问题理解都需要你了解底层机制。 细节过程 为了方便大家对通信底层理解,花了些时间做了下面这个动画,它并不能完全覆盖底层细节全貌,但是对于理解套接工作机制已经足够了。...同样,服务器内核网络模块也会有单独线程不停地将收到数据拷贝到套接read buffer中等待用户层读取

54610

【动画】当我们在读写Socket时,我们究竟在读写什么?

简单过程 当客户端和服务器使用TCP协议进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接socket将字节数组发送到服务器,服务器通过套接socket读取到字节数组...,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接将自己数组发送给客户端,客户端通过套接socket读取到自己数组,再反序列化成响应对象...在互联网技术服务行业工作多年经验告诉,如果你对底层机制不了解,你就会不明白为什么套接socket读写会出现各种奇奇乖乖问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题...对于这些问题理解都需要你了解底层机制。 细节过程 为了方便大家对通信底层理解,花了些时间做了下面这个动画,它并不能完全覆盖底层细节全貌,但是对于理解套接工作机制已经足够了。...同样,服务器内核网络模块也会有单独线程不停地将收到数据拷贝到套接read buffer中等待用户层读取

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

【动画】当我们在读写Socket时,我们究竟在读写什么?

一、简单过程 当客户端和服务器使用TCP协议进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接socket将字节数组发送到服务器,服务器通过套接socket读取到字节数组...,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接将自己数组发送给客户端,客户端通过套接socket读取到自己数组,再反序列化成响应对象...在互联网技术服务行业工作多年经验告诉,如果你对底层机制不了解,你就会不明白为什么套接socket读写会出现各种奇奇乖乖问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题...对于这些问题理解都需要你了解底层机制。 二、细节过程 为了方便大家对通信底层理解,花了些时间做了下面这个动画,它并不能完全覆盖底层细节全貌,但是对于理解套接工作机制已经足够了。...同样,服务器内核网络模块也会有单独线程不停地将收到数据拷贝到套接read buffer中等待用户层读取

61720

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

服务器通过套接socket读取到字节数组,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接将自己数组发送给客户端,客户端通过套接...socket读取到自己数组,再反序列化成响应对象。...在互联网技术服务行业工作多年经验告诉,如果你对底层机制不了解,你就会不明白为什么套接socket读写会出现各种奇奇乖乖问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题...5、Socket读写细节过程分析 为了方便大家对通信底层理解,花了些时间做了下面这个动画,它并不能完全覆盖底层细节全貌,但是对于理解套接工作机制已经足够了。...同样,服务器内核网络模块也会有单独线程不停地将收到数据拷贝到套接read buffer中等待用户层读取

1.2K22

小林网站上线一个月了

即使服务端先收到了请求 B,服务端其实不能够从内核读取到请求 B 数据,因为在还有收到请求 A 时, 请求 B TCP 字节其实是乱序,所以无法被服务端读取到。...所以,服务端是会按浏览器发出请求顺手顺序响应请求。 那么,如果服务端在处理 A 请求时耗时比较长,那么后续请求处理都会被阻塞住,这称为「队头堵塞」。...问题 小林回答: 嗯嗯,就留言区补充下吧,udpconnect不是建立连接,而是绑定ip和port,也就是建立(UDP 套接——目的地址 + 端口)之间映射关系。...如果 UDP 不使用 connect 方式,每次发送报文都会需要这样过程: 连接套接→发送报文→断开套接→连接套接→发送报文→断开套接 →……… 而如果 UDP 使用 connect 方式,就会变成下面这样...: 连接套接→发送报文→发送报文→……→最后断开套接 连接套接需要一定开销,比如需要查找路由表信息。

61440

高性能网络编程(一)----accept建立连接(陶辉)

掌握高性能网络编程,涉及到对网络、操作系统协议栈、进程与线程、常见网络组件等知识点,需要有丰富项目开发经验,能够权衡服务器运行效率与项目开发效率。以下图谈谈个人对高性能网络编程理解。 ?...如上图红色文字所示,认为编写高性能服务器关注点有3个: 1、如果基于通用组件编程,关注点多是在组件如何封装套接编程细节。...2、通用组件只是在封装套接,操作系统是通过提供套接为进程提供网络通讯能力。所以,不了解套接编程,往往对组件性能就没有原理上认识。...网络IO中应用服务器往往聚焦于以下几个由网络IO组成功能中:A)与客户端建立起TCP连接。B)读取客户端请求流。C)向客户端发送响应流。D)关闭TCP连接。E)向其他服务器发起TCP连接。...这幅图中可以看到,阻塞套接上使用accept,第一个阶段是等待ACCEPT队列不为空阶段,它耗时不定,由客户端是否向自己发起了TCP请求而定,可能会耗时很长

84910

面试问到TCP HTTP 和 Scoket 三者区别

如前所述,客户端套接是客户进程和 TCP 连接之间 “门”,服务器端套接是服务器进程和同一 TCP 连接之间 “门”。...客户往自己套接发送 HTTP 请求消息,也从自己套接接收 HTTP 响应消息。类似地,服务器从自己套接接收 HTTP 请求消息,也往自己套接发送 HTTP 响应消息。...3、服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接,由客户端读取。一个响应由状态行、响应头部、 空行和响应数据4部分组成。...然后解析每一个响应头,响应头告知以下为若干字节 HTML文档和文档字符集。客户端浏览器读取响应数据HTML,根据HTML语法对其进行格式化,并在浏览器窗口中显示。...连接确认 :是指当服务器端套接监听到或者说接收到客户端套接连接请求,它就响应客户端套接请求, 建立一个新线程,把服务器端套接描述发给客户端,一旦客户端确认了此描述,

99110

Flask 之父:不觉得有异步压力

它使得这种事情变得非常简单:等待可能需要一些时间才能完成操作。 它是如此简单,以至于创造了无数新方法坑人(blow ones foot off)。...这里非常重要是大多数套接都基于 TCP,而 TCP 具有内置流量控制。writer 只会按照 reader 可接受速度写入(给予或占用一些缓冲空间)。...我们看不到是因为过载而在等待,还是因为生成响应需花费很长时间而在等待。基本上,我们一直在这里缓冲,直到服务器最终耗尽内存并崩溃。 这是因为我们没有关于背压沟通渠道。那么我们将如何解决呢?...在传统上,这些协议中有很多是基于 TCP ,如前所述,它具有内置流量控制。但是,此流量控制并没有真正通过套接字库公开,这就是为什么高级协议通常需要向其添加自己流量控制原因。...因为 TCP 在后台对流量控制进行静默式管理,这可能会使开发人员陷入一条危险道路,他们只知从套接读取字节,并误以为这是所有该知道信息。

1.1K20

高性能网络编程(一)—-accept建立连接

掌握高性能网络编程,涉及到对网络、操作系统协议栈、进程与线程、常见网络组件等知识点,需要有丰富项目开发经验,能够权衡服务器运行效率与项目开发效率。以下图谈谈个人对高性能网络编程理解。 ?...如上图红色文字所示,认为编写高性能服务器关注点有3个: 1、如果基于通用组件编程,关注点多是在组件如何封装套接编程细节。...2、通用组件只是在封装套接,操作系统是通过提供套接为进程提供网络通讯能力。所以,不了解套接编程,往往对组件性能就没有原理上认识。...网络IO中应用服务器往往聚焦于以下几个由网络IO组成功能中:A)与客户端建立起TCP连接。B)读取客户端请求流。C)向客户端发送响应流。D)关闭TCP连接。E)向其他服务器发起TCP连接。...这幅图中可以看到,阻塞套接上使用accept,第一个阶段是等待ACCEPT队列不为空阶段,它耗时不定,由客户端是否向自己发起了TCP请求而定,可能会耗时很长

92040

高性能网络编程(一)—-ACCEPT建立连接

掌握高性能网络编程,涉及到对网络、操作系统协议栈、进程与线程、常见网络组件等知识点,需要有丰富项目开发经验,能够权衡服务器运行效率与项目开发效率。以下图谈谈个人对高性能网络编程理解。 ?...如上图红色文字所示,认为编写高性能服务器关注点有3个: 1、如果基于通用组件编程,关注点多是在组件如何封装套接编程细节。...2、通用组件只是在封装套接,操作系统是通过提供套接为进程提供网络通讯能力。所以,不了解套接编程,往往对组件性能就没有原理上认识。...网络IO中应用服务器往往聚焦于以下几个由网络IO组成功能中:A)与客户端建立起TCP连接。B)读取客户端请求流。C)向客户端发送响应流。D)关闭TCP连接。E)向其他服务器发起TCP连接。...这幅图中可以看到,阻塞套接上使用accept,第一个阶段是等待ACCEPT队列不为空阶段,它耗时不定,由客户端是否向自己发起了TCP请求而定,可能会耗时很长

81710

前端-最经典面试题之一,你能答出什么幺蛾子?

,下面就可以收发数据; 发送数据是 HTTP 请求消息,发送过程是:浏览器通过描述符查找到指定套接,并向套接发送数据,数据便会通过网络传输到服务端套接,服务器接收到消息后处理然后返回响应消息...之后,操作系统断开套接连接,本地套接也会被删除。 TCP 连接 在“委托协议栈发送消息”部分简单地提了下客户端和服务端利用套接进行连接,那这个连接具体是什么样呢? 首先什么是套接?...套接其实就是个放在内存备忘录,协议栈在发送数据时先看一眼备忘录,了解这个数据是发到哪个端口,当数据发送出去后,这个备忘录还得记录什么时间收到响应、什么时候断开等控制信息,协议栈需要根据这些信息决定下一步做什么...套接则会写入相应信息,然后将状态改为“正在连接”; 服务端 TCP 模块收到连接请求后就要回应,与客户端一样, 需要TCP 头部设置发送方和接收方端口号,以及将 SYN 设为 1,同时,返回响应时还要将...但是如果数据量本来就很小,或者应用程序发送数据频率很小,那协议栈就不得不等很长时间,所以协议栈内部还有一个定时器,一定时间之后就会将包发送出去。

49330

Golang中用到Websocket库

套接(SOCK_STREAM),也称为面向连接套接,使用传输控制协议 (TCP)、流控制传输协议 (SCTP) 或数据报拥塞控制协议 (DCCP)。...套接通信 每个网络套接都由地址标识,地址是传输协议、IP 地址和端口号三元组。主机之间通信主要有两种协议:TCP 和 UDP。...连接到 TCP 套接 Go 客户端使用 net 包中 DialTCP 函数来建立 TCP 连接。DialTCP 返回一个 TCPConn 对象。...一旦服务器定义了一个 WebSocket 请求,它需要用一个握手响应来回复。不能使用 http.ResponseWriter 编写响应,因为一旦开始发送响应,它将关闭底层 TCP 连接。...http劫持接管底层 TCP 连接处理程序和 bufio.Writer。这可以在不关闭 TCP 连接情况下读取和写入数据。

1.8K20

超详细Socket通信原理和实例讲解

# n 显示 IP 地址和端口号 # o 显示套接程序 PID计算机会出现下面结果。...至此套接创建就已经完成了。套接创建完成后,会返回一个套接描述符给应用程序,这个描述符相当于是区分不同套接号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。...请求过程完成后,服务器 TCP 模块会返回响应,这个过程和客户端是一样。在一个完整请求和响应过程中,控制信息起到非常关键作用(具体作用我们后面会说)。...收到服务器发来 FIN 请求后,客户端协议栈会将套接标记为断开连接状态,然后,客户端会向服务器返回一个确认号,这是断开连接第一步,在这一步之后,应用程序还会调用 read 读取数据。...删除套接通信完成后,用来通信套接就不再会使用了,此时我们就可以删除这个套接了。不过,这时候套接不会马上删除,而是等过一段时间再删除。

99720

谈谈Netty线程模型

;当客户端发来一个连接请求时候,boss线程池组中注册了监听套接NioEventLoop中Selector会读取读取完成了TCP三次握手请求,然后创建对应连接套接通道NioSocketChannel...如上图上侧部分为Netty Client部分,当NettyClient启动时候会创建一个NioEventLoopGroup,用来发起请求并对建立TCP三次连接套接读写事件进行处理。...总结一句话就是使用Netty框架进行网络通信时候,当我们发起请求后请求会马上返回,而不会阻塞我们业务调用线程;如果我们想要获取请求响应结果,也不需要业务调用线程使用阻塞方式等待,而是当响应结果出来时候使用...上所有连接套接读写事件,代码1.2用来统计其耗时,由于默认情况下ioRatio为50,所以代码1.3尝试使用与代码1.2执行相同时间运行队列里面的任务。...也就是处理套接读写事件与运行队列里面任务是使用时间片轮转方式轮询执行。 三、总结 Netty异步非阻塞基于事件驱动模型大大简化了我们编写网络应用程序成本。

52010

Java SE 网络

一旦套接被打开,Socket类中getInputstream方法返回一个InputStream对象。TCP(传输控制协议)网络协议。...套接超时套接读取消息时,在有数据可供访问之前,读操作将会阻塞。 如果此时主机不可达,那么应用将要等待很长时间,并且因为受底层操作系统限制而最终会导致超时。对于不同 应用,应该确定合理超时值。...但是,如果关闭一个套接,那么与服务器连接将立即断开,因而也就无法读取服务器相应了。使用半关闭可以解决上面的问题。...线程因套接无法响应而产生阻塞时,则无法通过调用interrupt解除阻塞。 中断套接操作,需要使用java.nio包提供一个特性 ---SocketChannel类。...由标准内容类型(比如text/plain和image/gif)所返回对象需要使用com.sun层次结构中进行处理。

76600

谈谈Netty线程模型

;当客户端发来一个连接请求时候,boss线程池组中注册了监听套接NioEventLoop中Selector会读取读取完成了TCP三次握手请求,然后创建对应连接套接通道NioSocketChannel...如上图上侧部分为Netty Client部分,当NettyClient启动时候会创建一个NioEventLoopGroup,用来发起请求并对建立TCP三次连接套接读写事件进行处理。...总结一句话就是使用Netty框架进行网络通信时候,当我们发起请求后请求会马上返回,而不会阻塞我们业务调用线程;如果我们想要获取请求响应结果,也不需要业务调用线程使用阻塞方式等待,而是当响应结果出来时候使用...上所有连接套接读写事件,代码1.2用来统计其耗时,由于默认情况下ioRatio为50,所以代码1.3尝试使用与代码1.2执行相同时间运行队列里面的任务。...也就是处理套接读写事件与运行队列里面任务是使用时间片轮转方式轮询执行。 三、总结 Netty异步非阻塞基于事件驱动模型大大简化了我们编写网络应用程序成本。

84610

python使用SocketServer实现网络服务器

这4个类是同步进行处理,另外通过ForkingMixIn和ThreadingMixIn类支持异步。 使用SocketServer步骤简介 创建服务器步骤。...•BaseServer.fileno():返回服务器监听套接整数文件描述符。通常用来传递给select.select(), 以允许一个进程监视多个服务器。...•BaseServer.requestqueuesize 请求队列大小。如果单个请求需要很长时间来处理,服务器忙时请求被放置到队列中,最多可以放requestqueuesize个。...•BaseServer.sockettype:服务器使用套接类型; socket.SOCKSTREAM和socket.SOCK_DGRAM等。...•BaseServer.server_activate():通过服务器构造函数来激活服务器。默认行为只是监听服务器套接。可重载。

5.1K20

【建议收藏】通俗易懂图解网络知识-第二篇

关于服务器模式程序设计流程: 套接初始化:用户对套接需求确定套接选项。 套接与端口绑定:将套接与一个地址结构进行绑定。...服务器在侦听连接时会设置这个参数,限制客户端中等待服务器处理连接请求队列长度 在客户端发送连接请求之后,可以从套接文件描述符中读取数据或者向描述符发送数据。...当服务器处理完数据,要结束与客户端通信过程时候,需要关闭套接连接。...问题2:为什么关闭连接需要四次挥手?...当服务端收到客户端FIN数据包后(第一次挥手),服务端不会立即close,为什么不立即close,因为可能数据还没有发完,服务端会先将ACK发送告诉客户端收到你断开请求(第二次挥手),请给我一点时间

1.3K10

收发数据原理(下)

返回ACK号等待时间(也叫超时时间),当网络繁忙时会发生拥塞,这时需要把等待时间设置长点,否则重发包了,上次需要返回ACK号才,这样会导致本来就拥塞网络更加要命。...如果设置等待时间过长,也不行,重传包会有很大延迟。这又要找一个时间平衡,真难!所以TCP采用了动态调整等待时间方法。这个等待时间根据ACK号返回所需时间判断。...同理,当需要连续发送多个窗口更新也可以减少包数量。 接收HTTP响应消息 客户端委托协议栈发送请求后,等待服务端返回消息,调用read程序获取响应消息。...这些操作完成后,就等待应用程序取数据了。 过了一会,应用程序就回来调用 read 读取数据。...通信结束之后,我们要删除套接,不过,套接不会立即被删除,而是会等待一段时间之后再被删除。

95720

CSAPP 网络编程 笔记

UDP采用循环服务器工作方式,它仅有的单个套接口用于接收所有到达数据报,并发回所有的响应,UDP套接口有一个接收缓冲区用于存放到来数据报。...SIGURG 信号、select 如果进程设置了 SO_OOBINLINE 选项,能否通过设置 MSG_OOB 标志读取带外数据?为什么?应该采用什么方式读取带外数据?...不能,SO_OOBINLINE 选项表示将紧急数据留到普通套接口缓冲区,所以正常 read 就行了。 可通过 sockatmark 读取带外标识位置。 阻塞与非阻塞 为什么会阻塞?...缺点:进程一直处于运行状态,可能占用大量CPU时间,影响其他进程运行效率。 非阻塞 非阻塞connect三个用途 完成connect需要花一个RTT时间,局域网几毫秒到广域网几秒。...非阻塞,进程还可以执行后续任务,提高自身工作效率,进程一直处于执行期间,可能占用大量CPU时间检测IO操作是否完成,影响其他进程执行效率。

52030
领券