序列号

TCP详解——连接建立与断开

醉酒当歌 提交于 2020-01-16 02:37:24
一、报文结构介绍   在开始讲TCP连接过程时,还是先看看TCP报文的格式如图1所示。IP数据报此时由IP头部+TCP头部+TCP数据组成。不带选项的TCP头部是20字节长,而带选项的,TCP头部最长可达60字节。常见的选项包括最大的大小(MSS),时间戳(传输控制时使用)、窗口缩放(流量控制时使用)、选择性ACK(传输控制时使用)。我们来具体看下TCP头部字段如图2所示。 图1 IP数据报中TCP封装   图2所示的即是TCP头部的详细结构。源端口与目的端口和源IP及目的IP这四元组唯一标识每个TCP连接。序列号(Sequence Number)字段标识TCP的一端到另一端的数据流的第一个开始字节(例如发送端发送的数据总字节长度为1000字节,假定序列号从1开始,总的序列号是1-1000,TCP会给每个字节赋予一个序列号)。通过序列号来代表发送端到接收端的数据,接收端接收到数据后,即可通过确认号(ACK)来发送给发送端,让发送端知道数据已被接受。这个ACK号是由接收到的数据的序列号加1,代表接收端希望接收的下一个数据的序列号。(注:ACK是不占用序列号的,原因是接收端发送ACK给发送端后,发送端的ISN是等于此时接收到的ACK号)。 图2 TCP头部结构   头部长度的单位32bit,所以这也定义了TCP的长度最大为4*15=60字节。八个标志位中(CWR、ECE。。。等)

TCP的三次握手与四次挥手理解及面试题(很全面)

流过昼夜 提交于 2020-01-14 23:33:02
本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接 PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。 字段 含义 URG 紧急指针是否有效。为1,表示某一位需要被优先处理 ACK 确认号是否有效,一般置为1。 PSH

RabbitMQ中文文档PHP版本(七)--发布者确认

久未见 提交于 2020-01-07 00:20:10
2019年12月10日10:07:12 原文: https://www.rabbitmq.com/tutorials/tutorial-seven-java.html 注意这里目前没有PHP版本只有java版本 发布者确认 发布者确认 是实现可靠发布的RabbitMQ扩展。 在通道上启用发布者确认后,代理将异步确认客户端发布的消息,这意味着它们已在服务器端处理。 (使用Java客户端) 先决条件 本教程假定RabbitMQ 已 在标准端口( 5672 )的 本地主机 上 安装 并运行 。 如果您使用其他主机,端口或凭据,则连接设置需要进行调整。 在哪里获得帮助 如果您在阅读本教程时遇到困难,可以 通过邮件列表 与我们 联系。 总览 在本教程中,我们将使用发布者确认来确保发布的消息已安全到达代理。 我们将介绍几种使用发布者确认并解释其优缺点的策略。 在频道上启用发布者确认 发布者确认是AMQP 0.9.1协议的RabbitMQ扩展,因此默认情况下未启用它们。 发布者确认在通道级别使用 confirmSelect 方法 启用 : Channel channel = connection.createChannel(); channel.confirmSelect(); 必须在希望使用发布者确认的每个频道上调用此方法。 确认仅应启用一次,而不是对每个已发布的消息都启用。 策略1

Excel中函数公式(下)

假如想象 提交于 2019-12-30 09:29:42
文本处理函数 Trim函数: 作用:除了单词之间的单个空格之外,移除文本中的所有空格。 语法:TRIM(text),Text为必需项,为要移除空格的文本。 Concatenate函数: 作用:将两个或多个文本字符串联接为一个字符串。 语法:CONCATENATE(text1, [text2], …),至少包含一个项目,最多255个项目,最多支持8192个字符,项目可以是文本值、数字、或单元格引用。 说明:可以利用连接符&实现相同的功能。 结果如下: Replace函数: 作用: 将 特定位置的字符串替换为不同的文本字符 。 语法: REPLACE(old_text, start_num, num_chars, new_text) , old_text为需要替换的文本 , start_num替换字符的位置 ,num_chars利用new_text替换的字符数,new_text要替换old_text的新文本。 Left函数: 作用:从文本字符串的第一个字符开始返回指定个数的字符。 LEFT(text, [num_chars]) ,text包含要提取的字符,num_chars为指定要提取的自负数量,必须≥0,如果大于文本长度,则返回全部文本,如果省略则假定其值为1。 Right函数: 用法同Left,只是取数方向相反,从右侧开始取数。 Mid函数: 作用:从指定位置开始提取特定数目的字符

以后面试官再问你三次握手和四次挥手,直接把这一篇文章丢给他

坚强是说给别人听的谎言 提交于 2019-12-28 15:37:37
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了。 面试官:然后呢? 求职者:这就是三次握手的过程,很简单的。 面试官:。。。。。。 (番外篇:一首凉凉送给你) 记住我的一句话: 面试时越简单的问题,一般就是隐藏着比较大的坑,一般都是需要将问题扩展的 。上面求职者的回答不对吗?当然对,但距离面试官的期望可能还有点距离。 希望大家能带着如下问题进行阅读,收获会更大。 请画出三次握手和四次挥手的示意图 为什么连接的时候是三次握手,关闭的时候却是四次握手? 什么是半连接队列? ISN(Initial Sequence Number)是固定的吗? 三次握手过程中可以携带数据吗? 如果第三次握手丢失了,客户端服务端会如何处理? SYN攻击是什么? 挥手为什么需要四次? 四次挥手释放连接时,等待2MSL的意义? 1. 三次握手 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

PHP接入萤石云开放平台直播功能

一曲冷凌霜 提交于 2019-12-27 03:24:04
PHP使用CURL调用萤石云开放平台直播接口 序言 整体逻辑 CURL 调用萤石云开放平台接口 1.根据appKey和secret获取accessToken 2.开通直播功能接口 3.获取直播地址接口 以上 OVER 序言 为了加强记忆,写的比较详细 关于萤石云开放平台 如果是自己测试的话,可以直接去 萤石云官网 ,注册成为开发者,在 开发者服务->我的应用 里有萤石云官方给的测试用的AppKey和Secret,可以供开发者测试接口。 如果是做项目的话,客户应该有开发者账号,找客户要一下AppKey和Secret。 另外 ,还需要 设备 的 序列号 和 通道号 整体逻辑 首先拿到 AppKey,Secret,序列号,通道号。有了AppKey和Secret就可以获取AccessToken。有了AccessToken,序列号,通道号,就可以获取直播地址了。 AppKey Secret AccessToken 序列号 : 通道号 CURL 先说一下 curl $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url);//$url为访问的接口地址 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);

TCP和UDP的区别

纵饮孤独 提交于 2019-12-26 23:58:38
转载至: https://www.cnblogs.com/steven520213/p/8005258.html TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于广播和细节控制交给应用的通信传输 UDP(User Datagram Protocol) UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。 即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。 TCP(Transmission Control Protocol) TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验、序列号、确认应答、重发控制

Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法

寵の児 提交于 2019-12-26 13:15:14
Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法: 一、先安装试用版,然后在"添加或删除程序"里找到VS2008,点"更改/删除"就会看到一个输入序列号的地方,把序列号输进去,点"升级"按钮即 可,Team Suite和Professional通用。 二、把安装盘下Setup目录下setup.sdb文件中的[Product Key]项中对应的序列号更改为正式版的序列号后再安装即可。此方法需要重新打包。 因为九十天试用版本已经是rtm版本。所以改变序列号以后的升级或者安装,就会变成正式版,不再有使用期限。 以下是收集的序列号: 1.Visual Studio 2008 Professional Edition: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT 2.Visual Studio 2008 Team Test Load Agent: WPX3J-BXC3W-BPYWP-PJ8CM-F7M8T 3.Visual Studio 2008 Team System: PYHYP-WXB3B-B2CCM-V9DX9-VDY8T 4.Visual Studio 2008 Team Foundation Server: WPDW8-M962C-VJX9M-HQB4Q-JVTDM 来源: https://www.cnblogs.com

the evaluation period for visual studio trial edition has ended的解决方法-转发

痴心易碎 提交于 2019-12-26 13:14:57
首先献上自己收集的 Visual studio 2008序列号 : Visual Studio 2008 Professional Edition: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT Visual Studio 2008 Team Test Load Agent:WPX3J-BXC3W-BPYWP-PJ8CM-F7M8T Visual Studio 2008 Team System:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T< Visual Studio 2008 Team Foundation Server:WPDW8-M962C-VJX9M-HQB4Q-JVTDM 1、如果你使用的是Windows xp操作系统,那么可以在“添加或删除程序”里找到VS2008,点“更改/删除”就会看到如下图所示的序列号输入框,点“升级”按钮即可。 2、如果你用的是Windows 7的话,因为在win7系统中微软遮蔽了序列号输入框,xp的方法是行不通的。这时你需要下载升级补丁(下载地址见文末),并在进入上图界面时以管理员身份运行它,如下图所示: 这时你就会惊奇地发现序列号输入框出现了,下面就不用说了吧!成功升级后会出现如下图所示的界面 [DDsofts.com]win7下VS2008升级补丁.zip 来源: https://www.cnblogs.com

Java 对象序列化和反序列化

别等时光非礼了梦想. 提交于 2019-12-26 02:56:36
之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列化机制就可以很好的解决这种操作。本篇就简单的介绍Java对象序列化,主要内容如下: 简洁的代码实现 序列化实现的基本算法 两种特殊的情况 自定义序列化机制 序列化的版本控制 一、简洁的代码实现 在介绍对象序列化的使用方法之前,先看看我们之前是怎么存储一个对象类型的数据的。 //简单定义一个Student类 public class Student { private String name; private int age; public Student(){} public Student(String name,int age){ this.name = name; this.age=age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int