参考文章:https://blog.csdn.net/qq_38950316/article/details/81087809
文章目录
在介绍三次握手与四次挥手之前我们先来了解一下TCP的头部结构是什么样的。
TCP头部的最大长度为60字节,其中包括TCP报文固定长度20字节+可变字节(最大40字节),具体结构如下:

在认识三次握手与四次挥手之前我们必须要直到以下字段及含义:
seq,占32位,用来标识从发送端到接收端发送的字节流。ack,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。在学习三次握手四次挥手后我们需要能流畅描述三次握手的流程及其中的字段含义作用的同时还需要记住每次握手时接收端和发送端的状态。
在三次握手中发送端有CLOSED、SYN-SENT、ESTABLISHED三种状态,接收端有CLOSED、LISTEN、SYN-RCVD、ESTABLISHED四种状态。
三次握手过程如下图:

假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSE。
起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。CLOSE,第一次握手后:客户端的状态为SYN-SENT(等待一个匹配的连接请求),此时服务端的状态为LISTEN(等待从任何远端TCP 和端口的连接请求)。起始序列号y,然后给客户端回复一段报文,其中包括标志位SYN=1,ACK=1,序列号seq=y,确认号ack=x+1。LISTEN,第二次握手后服务端的状态为SYN-RCVD(等待连接请求确认),此时客户端的状态为SYN-SENT。标志位ACK=1,序列号seq=x+1,确认号ack=y+1。SYN-SENT,第三次握手后客户端和服务端的状态都为ESTABLISHED(表示一个打开的连接,接收到的数据可以被投递给用户)。需要注意的一点是:
- 第一次握手,客户端向服务端发起建立连接报文,会占一个序列号。
- 但是第三次握手,同样是客户端向服务端发送报文,这次却不占序列号.
- 所以建立连接后,客户端向服务端发送的第一个数据的序列号为x+1。
客户端在四次挥手过程中有ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、CLOSED等五个状态,服务端有ESTABLISHED、CLOSE-WAIT、LAST-ACK、CLOSED等四种状态。
四次挥手过程如下图:

假设客户端首先发起的断开连接请求
FIN=1,序列号seq=u。此时客户端只能接收数据,不能向服务端发送数据。标志位ACK=1,序列号seq=v,确认号ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。标志位FIN=1,标志位ACK=1,序列号seq=w,确认号ack=u+1。标志位ACK=1,序列号seq=u+1,确认号ack=w+1。答:不可以,主要从以下两方面考虑(假设客户端是首先发起连接请求):
答:因为需要确保通信双方都能通知对方释放连接。
所以断开TCP连接需要客户端和服务端分别通知对方并分别收到确认报文,一共需要四次。
答:默认客户端首先发起断开连接请求,从上图可以看出:
答:其中MSL的意思是报文的最长寿命,可以从两方面考虑:
可靠的实现TCP全双工连接的终止;
允许老的重复分节在网络中消逝。
答:如果TCP连接已经建立,在通信过程中,客户端突然故障,那么服务端不会一直等下去,过一段时间就关闭连接了。具体原理是TCP有一个保活机制,主要用在服务器端,用于检测已建立TCP链接的客户端的状态,防止因客户端崩溃或者客户端网络不可达,而服务器端一直保持该TCP链接,占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。
保活机制原理:设置TCP保活机制的
保活时间keepIdle,即在TCP链接超过该时间没有任何数据交互时,发送保活探测报文;设置保活探测报文的发送时间间隔keepInterval;设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应,则服务器端即关闭与客户端的TCP连接。
答:第三次握手的时候可以携带数据的,第一次、第二次握手不可以携带数据。
ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报
我在这里尝试使用yarn,遇到了一个可能与ruby相关的问题。在执行任何yarn命令,我收到错误.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)错误堆栈:$yarn.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)Didyoume
我正在尝试创建一个使用一次的HTTP服务器来处理单个回调,并且需要帮助在Ruby中找到一个空闲的TCP端口。这是我正在做的事情的框架:require'socket't=STDIN.readport=8081whiles=TCPServer.new('127.0.0.1',port).acceptputss.getss.print"HTTP/1.1200/OK\rContent-type:text/plain\r\n\r\n"+ts.closeexitend(它回显标准输入到第一个连接然后死掉。)如何自动找到空闲端口进行监听?这似乎是在远程服务器上启Action业然后使用唯一作业ID回调
打印机是常见的办公设备之一,可以将电脑上需要的文档打印出来方便阅读,那你知道怎么查看打印机的ip地址吗?下面小编就来教教大家电脑查看打印机ip地址的三种方法。 怎么查看打印机的ip地址? 方法一: 1、首先大家可以看看自己的打印机有没有lcd屏幕。 2、有的话就进入菜单,然后可以在里面的选项中显示“ip地址”。 方法二: 1、首先按下快捷键“win+r”输入“control”。 2、然后在控制面板中点击硬件和声音下面的“查看设备和打印机”。 3、找到了之后右击,选择“属性”。 4、最后点击“web服务”就可以看到地址了。 方法三: 1、首先按下快捷键“win+r”打开
首先请注意,我在StackOverflow和网络上的文章中发现了几个类似的问题,但没有一个能帮助我解决我的问题:PGErrorcouldnotconnecttoserver:ConnectionrefusedIstheserverrunningonport5432?PG::ConnectionBad-couldnotconnecttoserver:Connectionrefusedpsql:couldnotconnecttoserver:Connectionrefused问题来了:我有一个非常棒的Rails应用程序。我和我的合作者使用GitHub一起工作。我们有一个master和一个m
承接上篇文章(十分钟了解关于TCP/IP网络的基础知识)五.ARP(地址解析协议) 虽说使用IP地址确实方便了我们使用者记忆以及整理归类、寻找信息的发送目的地,但是最终接收数据的地方,还是MAC地址,于是乎,为了实现有IP地址到MAC地址的转换,引入了名为ARP(AddressResolutionProtocol)又称之为地址解析协议。 ARP通过广播(Broadcast,这是个专业名词,后面还会继续提起)的方式对LAN中所有的计算机提问:“哎,谁IP地址是10.165.7.116(上篇文章中的例子)呀?你MAC地址多少啊,快过来登记一下!”,如果有哪台计算机回复了MA
几周前Jekyll对我来说工作正常,但现在突然出现以下错误:TCPServerError:Addressalreadyinuse-bind(2)INFOWEBrick::HTTPServer#start:pid=7300port=4000%lsof-i:4000即使端口上没有任何运行。以下是详细信息:%jekyll--versionJekyll0.11.2%wherejekyll/home/bhaarat/.rvm/gems/ruby-1.9.2-p290/bin/jekyll/usr/bin/jekyll%ruby--versionruby1.9.2p290(2011-07-09re
我正在使用Three.js。我有一组3D点(x,y,z)和一组面孔。一张脸由K个点组成。它既可以是凸的也可以是凹的。我在Three.js文档中找不到任何可以帮助我的东西。一种解决方案可能是对这些形状进行三Angular剖分,但到目前为止我还没有找到任何简单的3D三Angular剖分算法。另一个解决方案是做类似的事情:varpointsGeometry=newTHREE.Geometry();pointsGeometry.vertices.push(newTHREE.Vector3(10,0,0));pointsGeometry.vertices.push(newTHREE.Vector
设置如下:Firefox(3.x和4b),具有正确设置和有效的证书,包括客户端证书。带有XMLHttpRequest()类型AJAX调用的网页到不同的子域。所述子域中的自定义Web服务器接受请求,并以宽容的Access-Control-Allow-Origin响应header和要求客户验证。问题是Firefox突然中止了请求(好吧,这就是它在firebug中所说的)。使用openssls_server运行设置而是暗示Firefox实际上甚至不发送客户端证书:140727260153512:error:140890C7:SSLroutines:SSL3_GET_CLIENT_CERTIF