TCP多人聊天室实现 1.1 分析 客户端 功能: 1. 数据发送 2. 数据接收 技术: 1. socket 2. 输入流和输出流 3.
为什么要做? 否则就会像我刚进入公司时,有个功能点没搞懂,也不去问、不敢问产品同学,全靠自己自由发挥。
经过这次系统学习,我终于明白「我为什么总学不好TS」。希望这篇文章对和我有同样经历的同学有帮助。 学不好的原因 想必你听过一句话 —— 「TS是JS的超集」。...也能得到答案: {}是对象字面量,肯定属于对象类型的子类型,所以r0为true Object处于JS原型链的顶端,所有对象类型肯定是他的子类型,所以r1为true 有了前两个结果,r2显然也为true 为什么没有
滑动窗口 顺序、丢包问题 确认和重发机制 流量控制 拥塞控制 前言 上一篇记录了TCP三次握手四次挥手的细节以及为什么会在TIME_WAIT状态停留时间为2MSL。...一直说TCP是可靠的协议,那么它靠什么成为一个可靠的传输协议? 实现一个可靠的协议?...对于TCP协议来说,他不知道整个网络路径都会经历什么,TCP发送包常被比喻为往一个水管里面灌水,而TCP的拥塞控制就是在不堵塞、不丢包的情况下,尽量发挥带宽。...第二个问题是 TCP 的拥塞控制要等到将中间设备都填充满了,才发生丢包,从而降低速度,这时候已经晚了。其实 TCP 只要填满管道就可以了,不应该接着填,直到连缓存也填满。...为了优化这两个问题,后来有了 TCP BBR 拥塞算法。
当业务服务的并发量上来之后,“乐观锁”反而成为影响业务服务吞吐量的定时炸弹,为什么要这么说呢?咱们可以这样想,10个线程处理一行数据,只能有一个线程处理成功,其他9个全是失败的。...所以这个就解释了“为什么乐观锁适合读多写少”的问题,主要目的是“既要提高业务接口的并发性,也要减少锁冲突带来的不必要的性能损耗,尤其是并发量非常高的业务场景”。...乐观锁与数据 为什么说“乐观锁”与数据关系很大了,因为咱们使用“乐观锁”就是为了保护我们数据的一致性,所以如果聊乐观锁,肯定会考察与数据相关的知识点,比如MySQL的锁,ElasticSearch的乐观锁等等
这一定程度上保证了TCP传输的可靠性,而不是我随便想发就发,不管你收到了没有。 3)重传机制 上面讲到了确认应答,那么如果没有收到应答应该在何时开始重传呢?...4)流量控制--滑动窗口 TCP两端互传肯定不能是随心所欲,想发就发,需要有一个东西来控制他们的发送接收速率,这个东西就是滑动串口。...在TCP中是维护两个绝对指针和一个相对指针来控制窗口,当前发送完但是还没确认的数据划分在发送窗口中,可用窗口中是维护即将发送的符合大小要求的数据。...为了解决这个问题,TCP的每个连接都会维护一个持续计时器,当收到对端的win=0的包之后就会开启计时,如果发送超时就会发送窗口探测报文,对方在确认这个报文的时候会带上win,以此打破死锁的局面。
事实就是,越成熟的大公司,内部有越多的内部组件内部系统,你在里面工作,你不需要担心应该采用什么数据库用什么语言什么发行版的 linux ,你只需要选择现有的组件设计好架构组织好代码就足够。...为什么?一道简单的算法题,你现在对着电脑想,可能没什么难度,一下就能写出来,但是面对面试的时候的压力,你能否在十几分钟内在纸上能写出整洁无 bug 的代码?...以前在知乎上面看过一个是清华的一个竞赛出身的学生问为什么 google 问的问题那么简单他答出来了还被拒了,你搞竞赛出身你有一身牛逼的 coding 本领熟悉各种奇技淫巧,但是要你解释思路的时候却三言两语就糊弄过去
TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...简单 tcp服务器和客户端就到这里,下期介绍多线程技术,实现一个多线程的聊天室程序。
在通信过程中,只需要对正常的报文进行确认,不需要对应答报文再次进行确认 在TCP报头中,既存在32位序列号,又存在32位确认号。为什么要有两组序号呢? 一切的一切都归究于TCP是全双工协议。...Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍....TCP连接是需要被双方管理起来的,被OS管理起来。先描述,再组织。维护一个连接是需要成本的【时空成本】 接下来,我们要讨论为什么需要三次握手: 一次握手不行吗?...6、四次挥手断开连接 如图: 为什么挥手需要四次? TCP的四次挥手是为了确保数据流的正确和可靠地关闭。这需要双方都明确地确认关闭请求,并确保所有的数据包都已接收或处理。...为什么要等待2MSL呢 ? 原因是 在网络中可能来自发送方发来的数据报,然后接收方要给对方一个响应. 这样报文一来一回的时间就是2MSL.
wide': 0 tcp:tcp_retransmit_skb...0 tcp:tcp_send_reset 0 tcp:tcp_receive_reset...5 tcp:tcp_rcv_space_adjust...0 tcp:tcp_retransmit_synack 9 tcp:tcp_probe...] [k] tcp_rcv_state_process + 50.00% 0.00% python [kernel.kallsyms] [k] __tcp_transmit_skb
其中复位标志RST的作用就是“复位相应的TCP连接”。 TCP连接和释放时还有许多细节,比如半连接状态、半关闭状态等。详情请参考这方面的巨著《TCP/IP详解》和《UNIX网络编程》。...大家可能有疑问了:服务器关闭了Connection为什么会返回“RST”而不是返回“FIN”标志。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...; 客户端和服务器统一使用TCP短连接。...,固定5分钟tcp连接回收,而且发现连接出错时,重发之前10s内消息。
这两年似乎听到同事间相互称“总”、“老板”、“领导”的越来越多。...为什么这是一个让人担忧的趋势呢?称呼中其实蕴含对资历、角色和权威的一种文化暗示。当我们固化了这些称呼,就等于是在组织层面上形成了态度,会牵引公司文化的发展方向。...万科上海公司前几年发了一个官方文件,要求内部称谓全面去“总”,被称呼者要上交100元到公司爱心捐款账户。这个文件发布之后就有员工反映,晚辈面对领导要直呼其名,很是不适应,让人纠结。...所以,让我们从停止相互称“总”开始。
NIO完成一个TCP聊天室 1.1 NIO TCP聊天室客户端完成 package com.qfedu.b_niochat; import java.io.IOException; import java.net.InetSocketAddress...; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; /** * NIO 非阻塞状态的TCP聊天室客户端核心代码...length > 0) { System.out.println(new String(buffer.array())); } } } 1.2 NIO TCP...聊天室服务端完成 package com.qfedu.b_niochat; import java.io.IOException; import java.net.InetSocketAddress;...聊天室客户端线程代码实现 package com.qfedu.b_niochat; import java.io.IOException; import java.util.Scanner; /**
• 面向连接:在使用 TCP 协议之前,必须建立TCP连接,在传送数据完毕之后,必须释放连接。 • TCP连接只能有两个端点:点对点 即一对一。 ...• TCP提供可靠交付的服务:通过TCP连接传送的数据无差错、不丢失、不重复、并且按序到达。 ...• TCP提供全双工通信:通信双方的应用进程任何时候都可以发送数据。 • TCP协议:一对一。 ...• TCP 连接:两端都设有发送缓存,接受缓存,用来储存临时通信的数据。发送时,应用程序把数据传送给TCP的缓存,就可以做其他事了。...接收时,TCP把收到的数据放入缓存,上层应用程序在合适的时候读取缓存。 • 面向字节流:TCP中的流指的是流入到进程或从进程中流出的字节序列。”
String 在 Java 中,我们有两种方式创建一个字符串 String x = "abc"; String y = new String("abc"); 你常见也常写第一种,很少见第二种,但面试还总问这类问题...为什么 String 类被 final 修饰 字符串池的需求 字符串池(String intern pool)是方法区域中的一个特殊存储区域。...这也是为什么在一般情况下,不可变类是首选的原因。...user 引用不能被更改指向内存的其他地址,但是由于 User 是可变对象,我们可以调用 user 的 setter 方法修改其属性 在String类中包含很多学问,包括你对JVM模型的理解,这也就是为什么面试官为什么喜欢问...String,主要考察你的基本功 灵魂追问 String 和基本类型的包装类如 Integer 和 Long 都被 final 修饰,但为什么不建议作为 synchronized 同步块的参数使用呢?
如何在 Linux 系统中查看 TCP 状态? TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看。 为什么是三次握手?不是两次、四次?...所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。...如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手为什么无法阻止历史连接呢?...为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?...既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
参考 TCP 为什么是三次握手,而不是两次或四次? 1. tcp三次握手流程 ? image.png 由图可知,tcp三次握手的关键在于,序列号seq的交换确认。 2....为什么不能是两次握手 因为对于客户端和服务端来说,双方对对方的序列号的确认是可靠传输的关键。...而在tcp中,通过三次握手,和丢包的处理机制,A和B都会确定自己的序列号被对方接收。 3. tcp对三次握手中丢包的处理 照搬自TCP 为什么是三次握手,而不是两次或四次?...为 Established状态,而B显然认为TCP为Active状态: a....这样,tcp的三次握手,加上对丢包的处理机制,就保证了A、B对双方序列号的确认。也就建立了可靠传输的基础。 4. 为什么不能是四次握手 把四次握手中的第二和第三步合并起来,就是三次握手了。
String 在 Java 中,我们有两种方式创建一个字符串 String x = "abc"; String y = new String("abc"); 你常见也常写第一种,很少见第二种,但面试还总问这类问题...我们最好使用 StringBuffer 或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间 到这里还没完,你有没有想过为什么...为什么 String 类被 final 修饰 字符串池的需求 字符串池(String intern pool)是方法区域中的一个特殊存储区域。...这也是为什么在一般情况下,不可变类是首选的原因。...user 引用不能被更改指向内存的其他地址,但是由于 User 是可变对象,我们可以调用 user 的 setter 方法修改其属性 在String类中包含很多学问,包括你对JVM模型的理解,这也就是为什么面试官为什么喜欢问
虽然TCP是面向连接协议,但是当TCP建立连接后,如果一端的网线被拔掉,或一端程序崩溃,如果期间没有发数据包,另一端不会发现TCP连接已断开。有些恶意攻击,只连接不收发数据,浪费TCP服务器资源。...TCP协议是支持Keep Alive机制,为什么应用还需要自实现心跳呢? 第一, TCP协议包含Keep Alive,但不是所有设备都会实现。...第二, TCP协议的Keep Alive包,属于TCP协议包,在连接之间如果有Sock Proxy 或 NAT,他们可能不会处理TCP Keep Alive包。...第三, TCP Keep Alive,只能说明TCP连接是活的,而应用实现心跳,可以保证应用是活的可正常工作,比如:TCP服务器的TCP连接是活的,但由于负载过高,无法处理业务,这时客户端心跳检测到无回应主动断开
领取专属 10元无门槛券
手把手带您无忧上云