网站建设是指,多个域名绑定同一网站吗,沧州营销型网站建设,网站开发维护成本计算目录
一、连接管理
二、三次握手 1、何为三次握手#xff1f; 2、三次握手有何意义#xff1f;
三、四次挥手
三次握手和四次挥手的相似之处和不同之处 #xff08;1#xff09;相似之处 #xff08;2#xff09;不同之处
四、TCP的状态
建立连接#xff1a;
断开…目录
一、连接管理
二、三次握手 1、何为三次握手 2、三次握手有何意义
三、四次挥手
三次握手和四次挥手的相似之处和不同之处 1相似之处 2不同之处
四、TCP的状态
建立连接
断开连接
CMD控制平台观察上面介绍的状态
LISTEN和ESTABLISHED
CLOSE_WAIT和TIME_WAIT 一、连接管理 正常情况下TCP要经历“三次握手”建立连接“四次挥手”断开连接。 TCP是有连接的我们程序员编写客户端代码时只要socket new Socket(String serverIP, int serverPort)操作系统内核中就会自动和服务器建立连接如图 内核是怎么完成上述建立连接的过程的呢——三次握手 而当要断开连接时内核是怎么进行的呢——四次挥手 二、三次握手 1、何为三次握手 在建立连接的过程中客户端一定是主动的一方第一次交互就是客户端发起的客户端首先要发送给服务器syn同步报文段然后服务器收到 syn 后服务器就会发送ack应答报文然后服务器也要发送 syn 给客户端客户端在收到 syn 后就会返回一个 ack 给服务器这是三次握手的就完成了如图 上面画的好像是四次交互啊那为啥称为三次握手呢原因很简单因为服务器给客户端发送的两个报文可以合并成一个也就是acksyn。为什么呢想象一下我们网购的时候同时买了两份商品商家是不是就会把这两份商品打包成一件商品一起邮寄给我们原因很简单就是节省成本。网络中也是如此反正ack和syn都要发到客户端中那为什么不直接打包成一份呢何况网络传输是要经过层层封装、分用多一个次传输传输成本就会增加好多也就成了三次握手如下图 除了节约成本外还有一个原因也是能合并的前提ack和syn的触发时机是一样的所以可以把这两个合并在一起。所以100%会合并 这里客户端在第一次交互中虽然已经发送给服务器syn了但是服务器是否要保存客户端的信息还得观望观望等这三次握手结束后才能保存客户端的信息确立连接以及后续的通信。 这里的第一次交互服务器收到客户端发来的syn服务器会有两种情况一、服务器同意表示服务器也愿意和客户端建立连接二、服务器不同意这种情况很少出现一般的原因就是服务器的负载极高已经处理不过来了客户端发来的请求处理不过来了服务器完全无法响应就没有下文了。 因为服务器是提供服务的所以客户端发来的请求就一定会尽可能的处理返回响应所以一般都会同意客户端的建立请求。 握手的英译handshake是一个形象的比喻握手只是打招呼不用商讨具体的细节业务逻辑也就是应用程序 / 应用层要完成的事情。其中这里就是简单的建立个连接而已没有其他操作还有三次握手也会有超时重传三次握手结束后超时重传也还存在。
syn的介绍所谓的syn就是一个特殊的TCP数据报 syn是六个标志位的第五位全称synchronize 表示同步的意思如图 表达的语义我想和你建立连接。这里的 syn 虽然不带有应用层载荷但也会带有 IP报头 / 以太网数据帧等等更会有TCP报头其中TCP报头中就包含了客户端自己的端口IP报头中就包含了客户端的IP。 2、三次握手有何意义
1投石问路确认客户端和服务器之间的通信通道是否“通畅” 比如地铁地铁每天的第一趟不是载客的而是先空车跑一趟确认列车是否能正常运行到目的地中间是否会有故障而三次握手也是有类似的功能通信前先确认通信链路是否是通畅的有一种投石问路的效果。
2三次握手也是在确定通信双方是否能发送信息和接受信息接受和发送能力是否正常 功能和上面画的图一样如图 第一次交互客户端先给服务器发送syn建立请求服务器收到了syn后就知道客户端的发送能力是没有问题的第二次交互服务器发送acksyn给客户端当客户端收到后客户端就知道了自己的发送能力没有问题服务器的接受和发送能力没有问题第三次交互客户端发送ack给服务器服务器收到ack服务器就能知道自己的发送能力和接受能力都没有问题还有客户端的接受能力也没有问题。
3建立连接的过程也会协商一些参数 因为网络通信是客户端和服务器两方的事情所以就要配合就要协商一些信息保证其中的有些内容要一样。 TCP协议中也有很多参数是要客户端和服务器双方进行协商的这些内容往往体现在 选项中如图 其中有一个信息是挺关键的TCP 的通信序号如图 也是因为网络传输中后发先至先发后至的情况是普遍存在的所以要引入序号这一概念。为了区分不同连接之间的数据包。 TCP在通信过程中序号不是从 0 / 1开始的而是选择一个比较大的数字以这个数字开头来计算即使是同一个客户端和服务器每次连接开始的序号都不同原因避免“前朝的件斩本朝的官”。啥意思如图 所以第二次连接旧的数据应该丢弃。而旧的数据包也能一眼就看出来原因就是每次连接就算是同一客户端和服务器的连接每次开始的序号也会不同就很容易区别新旧数据包把旧的数据包丢弃。 比如清朝的人和我们现代人走在一起想象清朝的人是“大粽子”是不是一眼就能看出来他“不是人”doge。 三、四次挥手 连接的过程本质是在于服务器和客户端直接能保存对端的信息是虚拟的连接而这些信息是要放在数据结构中的。 断开连接的过程本质就在于把服务器和客户端里保存的对端的信息在数据结构上给释放掉是逻辑上的断开连接也是虚拟的。 其中四次挥手有点类似现实中的离婚的“和离”和平分手因为结婚领证后是具有法律效应的如果要离婚就会牵扯到财产纠纷问题并不是其中的一方想离就立即能离的一般要确认财产分配问题双方的观念达成一致才能离成这种情况就是“和离”而四次挥手呢也并不是客户端和服务器的其中一端的单方面情况想断开连接就断开连接而是要遵循一些约定经过四次挥手的过程后才能断开连接。 那么四次挥手的过程是咋样的呢断开连接并不像建立连接发送端一定是客户端断开连接的发起者可以是服务器也可以是客户端大概流程如图 这里就涉及到四次交互其中服务器这边是不可以把ack和fin进行合并一起发送给客户端的为什么呢原因就是服务器这边的ack和fin触发时机是不一样的服务器接受到对端的fin时就会立即发送ack给对端而fin要经历一些程序员写的一些代码一些逻辑后才能执行服务器这边的代码 socket.close()才会给对端发fin。当然也不是绝对的如果服务器这边的如果断开连接的代码很少fin和发送ack的触发时机几乎是同一时间这时候服务器当然也可以把ackfin合并到一起再发送给对端啦。所以中间两次可以合并吗我们称为 如合 上面这四次交互就是四次挥手的过程了。
三次握手和四次挥手的相似之处和不同之处 1相似之处 传输顺序是相似的都是各自给对端发生 syn / fin对端返回ack然后对端再发送 syn / fin , 当前端再返回回去ack。 三次握手交互顺序syn / ack / syn / ack 四次挥手交互顺序fin / ack / fin /ack 2不同之处 发送方的约定不同三次握手的发送方主动方必须是客户端四次挥手的发送方双方主动方都可以。 四、TCP的状态 下图是TCP状态转换的汇总 这里主要介绍四个常用的状态。
建立连接 LISTEN状态在Linux系统是LISTENWindows系统是LISTENING表示服务器这边已经创建好ServerSocket了并且已经好绑定IP地址和端口了随时可以接收客户端发来的请求。 ESTABLISHED状态表示三次握手的过程已经结束了客户端和服务器之间已经建立好连接了。
断开连接 CLOSE_WAIT状态表示被动方的这一端收到了对端发来的fin后会进入这个状态。 TIME_WAIT状态表示主动方这一端发送给对端fin后对端也发送fin给我后本端会处于这个状态就是为了给最后一个ack的重传留有一定时间。
CMD控制平台观察上面介绍的状态
首先启动我们之前写的TCP代码启动这服务器和客户端。
详细代码在网络编程套接字(4)——Java套接字TCP协议-CSDN博客
其中服务器和客户端的端口和地址如图 LISTEN和ESTABLISHED
只启动服务器 在CMD控制平台输入netstat -ano | findstr 9090 第一列是协议第二列是本地地址第三列是外部地址第四列是状态第五列是 PID。 其中这里0.0.0.0是本机所有网络接口的地址是本网络中的本机也就是说表示当前设备上所有可用的IP地址也称为通配地址。而127.0.0.1是回环地址是为了让本机能够实现自我测试和自我通信。 方括号是IPV6的地址。 服务器的端口号是9090也就是服务器的地址当前状态是LISTENING表示服务器已经绑定好了IP地址和端口随时可以和客户端建立连接。 大概流程如下图 启动服务器和客户端 在CMD控制平台输入netstat -ano | findstr 9090 客户端是第三行服务器是第二行其中它们的状态都变成了ESTABLISHED表示服务器和客户端两端已经建立了联系。
CLOSE_WAIT和TIME_WAIT 在Windows操作系统CLOSE_WAIT和TIME_WAIT是不容易被观察到的用CMD控制平台看不到这个状态。 其中这里TIME_WAIT是为了给最后一个ack重传留有一定的时间。其中最后一个ack要发送给服务器客户端和服务器之间在数据结构中保存的对端信息才能被释放掉如果最后一个ack丢包了客户端这边也不知道是啥情况就可以使用TIME_WAIT状态进行标记如果ack丢包了就等一定的时间给客户端这边重传ack提供保障。 当然这里也不是无休止的等是有一定是时间限制的最多等2MSLMSL是一个系统内核的配置项表示服务器和客户端之间消耗最多的时间常见的设置值是2 min这里如果等了2MSL还没收到客户端发来的ack也意味着客户端这边不可能会发ack过来了再也不会重传了就直接断开连接吧丢弃一些在数据结构中的信息。 一般而言对于服务器出现大量的CLOSE_WAIT状态原因就是服务器没有正确关闭socket导致四次挥手没有正确完成这是应该BUG只需要加上对应的close即可。