- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章TCP网络那点破事!三次握手、四次挥手、TIME-WAIT、HTTP 2.0 ....由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家好,我是Tom哥~ 。
今天主要给各位分享TCP网络的一些常见知识点,日常工作或面试会经常遇到。考虑内容篇幅不小,建议先收藏,慢慢咀嚼.
如果有帮助,也请转给身边的朋友们,”独乐乐不如众乐乐“ 。
首先,来个目录,让大家对文章内容先有个直观了解 。
网络的七层模型,简单介绍每层的作用?
答案:分为7层,从下到上依次是:
答案:
答案:目的是同步连接双方的序列号和确认号,并交换TCP窗口.
答案:
如果只有两次握手,那么服务端向客户端发送 SYN/ACK 报文后,就会认为连接建立。但是如果客户端没有收到报文,那么客户端是没有建立连接的,这就导致服务端会浪费资源.
使用两次握手无法建立 TCP 连接,而使用三次握手是建立连接所需要的最小次数 。
答案:
答案:TCP 是全双工。一方关闭连接后,另一方还可以继续发送数据。所以四次挥手,将断开连接分成两个独立的过程.
答案:MSL 是报文段在网络上最大存活时间.
确保 ACK 报文能够到达服务端,从而使服务端正常关闭连接。客户端在发送完最后一个 ACK 报文段后,再经过 2MSL,就可以保证本连接持续的时间内产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段.
答案:发送、接收缓存各4k,还要考虑socket描述符,一个tcp连接需要占用的最小内存是8k,那么最大连接数为:8*1024*1024 K / 8 K = 1048576 个,即约100万个tcp长连接.
答案:传输层封包不能太大,基于这个限制,往往以缓冲区大小为单位,将数据拆分成多个 TCP 段(TCP Segment)传输。在接收数据的时候,一个个 TCP 段又被重组成原来的数据。简单来讲分为几个过程:拆分——传输——重组.
答案:解决数据太小问题,防止多次发送占用资源。TCP 协议将它们合并成一个 TCP 段发送,在目的地再还原成多个数据.
答案:缓冲区是在内存中开辟的一块区域,目的是缓冲。当应用频繁地通过网卡收、发数据,网卡只能一个一个处理。当网卡忙不过来的时候,数据就需要排队,也就是将数据放入缓冲区.
注意:TCP Segment 的大小不能超过缓冲区大小.
答案:
大数据拆包成多个片段,发送可以保证有序,但是由于网络环境复杂,并不能保证它们到达时也是有序的,为了解决这个问题,对每个片段用Sequence Number编号,接收数据的时候,通过 Seq 进行排序.
注意:seq是累计的发送字节数 。
答案:丢包需要重发,关键是如何判断有没有丢包.
每一个数据包,接收方都会给发送方发响应。每个 TCP 段发送时,接收方已经接收了多少数据,用 Acknowledgement Number(简写ACK) 表示.
注意:ack是累计的接收字节数,表示这个包之前的包都已经收到了.
答案:MSS 全称 Maximun Segment Size。是TCP Header 中的可选项(Options),控制了 TCP 段的大小,不能由单方决定,需要双方协商.
答案:简单讲通过滑动窗口。发送、接收窗口的大小可以用来控制 TCP 协议的流速。窗口越大,同时可以发送、接收的数据就越多,吞吐量也就越大。但是窗口越大,如果数据发生错误,损失也就越大,因为需要重传越多的数据.
TCP每个请求都要有响应,如果一个请求没有收到响应,发送方就会认为这次发送出现了故障,会触发重发。为了提升吞吐量,一个TCP段再没有收到响应时,可以继续发送下一个段.
答案:
1、HTTP 1.0 。
2、HTTP 1.1 。
3、HTTP 2.0 。
答案:HTTPS = HTTP + SSL/TLS 。
HTTP 采用明文通讯;端口 80 。
HTTPS 在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。端口 443 。
HTTP 协议为什么要设计成无状态?
答案:HTTP是一种无状态协议,每个请求都是独立执行,请求/响应。这样设计的重要原因是,降低架构设计复杂度,毕竟服务器一旦带上了状态,扩容、缩容、路由都会受到制约。无状态协议不要求服务器在多个请求期间保留每个用户的信息.
但,你可能会问,如果有登录要求的业务怎么办?HTTP协议提供扩展机制,Header中增加了Cookie,存储在客户端,每次请求时自动携带,采用空间换时间机制,满足上下请求关联。虽然浪费了些网络带宽,但是减少了复杂度。当然为了减轻网络负担,浏览器会限制Cookie的大小,不同浏览器的限制标准略有差异,如:Chrome 10,限制最多 180个,每个Cookie大小不能超过 4096 bytes 。
答案:
答案:
答案:Wireshark,应用最广泛的网络协议分析器。功能非常丰富 。
原文链接:https://mp.weixin.qq.com/s/-T9AiIEQdbFzYxkl_qmDPQ 。
最后此篇关于TCP网络那点破事!三次握手、四次挥手、TIME-WAIT、HTTP 2.0 ....的文章就讲到这里了,如果你想了解更多关于TCP网络那点破事!三次握手、四次挥手、TIME-WAIT、HTTP 2.0 ....的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在一次采访中遇到过这个问题。 线程中wait和wait on time有什么区别? 我知道 wait 方法 导致当前线程等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll
我在这里得到了一个 java 代码片段,这让我想知道调用 wait() 和 this.wait() 之间的区别是什么。 假设您有一个类,该类具有获取资源的方法并且是同步的。通常,如果资源不可用,我会在
我知道如何使用 wait_event 在 Linux 内核队列中等待以及如何唤醒它们。 现在我需要弄清楚如何同时在多个队列中等待。我需要多路复用多个事件源,基本上以类似于 poll 或 select
c系统编程中wait(null)和wait(&status)有什么区别? 指针状态的内容是什么? 最佳答案 如果您调用 wait(NULL) ( wait(2) ),您只会等待任何子进程终止。使用 w
设想: 用户单击 View 上的按钮 这会调用 ViewModel 上的命令 DoProcessing 考虑到 View 和 ViewModel 的职责,Wait 光标是如何以及在哪里设置的? 为了清
我在使用 Selenium 的代码中看到了 FluentWait 和 WebDriverWait。 FluentWait 使用轮询技术,即它将在每个固定时间间隔轮询特定的 WebElement。我想知
我编写了以下代码,其中 start 方法应该等待,直到 stop 方法通知它。但是在执行过程中,尽管我已指定它等待,但启动方法下面的日志行会被打印。下图是我的start方法实现如下。 private
我有以下连接到 SignalR Hub 的代码 private static async Task StartListening() { try {
我对线程中的 wait() 方法如何工作感到很困惑。假设我写: public class test3 { public static void main(String args[]){
在使用 Java 线程原语构造线程安全有界队列时 - 这两种构造之间有什么区别 创建显式锁定对象。 使用列表作为锁并等待它。 示例 1 private final Object lock = new
故事: 在 Java selenium 语言绑定(bind)中有一个 FluentWait class ,这允许严格控制如何检查预期条件: Each FluentWait instance defin
wait-die 和 wound-wait 算法有什么区别? 这两种死锁预防技术似乎都在做同样的事情:回滚旧进程。 两者有什么区别? 请提供一个合适的例子来对比这两种算法。 最佳答案 Wait-Die
在 Java 线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: - locked (a java.io.BufferedInputStream) 2: - waiting to l
以下代码运行大约需要 20 秒。然而,取消注释 do! 后只用了不到一秒的时间。为什么会有这么大的差异? 更新:使用ag.Add时需要9秒。我已经更新了代码。 open FSharpx.Control
我在 ASP.NET WebForms 网站上有一个服务器端点击事件。在这种情况下,我调用一个方法,该方法又调用其异步合作伙伴方法,在调用中添加 .Wait()。 此方法然后向下几个级别(即,调用另一
有 3 种状态的线程处于 Activity 状态但既不运行也不可运行:- sleep 已阻止 正在等待 当线程执行 sleep() 方法时,它会在其参数指定的时间段(比如几毫秒)内从运行状态进入休眠状
考虑以下代码 public class ThreadTest1 { private static final long startTime = System.currentTimeMillis();
我有一个使用线程的 Java 应用程序,它使用多个 Lock 对象实例来同步对公共(public)资源的访问。 现在,作为性能测量的一部分,我想测量每个线程在每个锁中花费的时间。到目前为止,我已经尝试
我写了下面这段代码: let first_row = rows_stream.take(1).wait(); 并收到以下错误(当我真正想要访问该元素时): found struct `futures:
我使用了两个命令来等待设备启动:adb 等待设备和 adb 等待设备。两者似乎都在等待设备启动,我发现它们的行为没有任何区别。他们的行为有什么不同吗? 添加更多关于我所做的信息: 所以这就是我所做的,
我是一名优秀的程序员,十分优秀!