php多平台商城网站系统建设,做网站建设平台,合肥企业网站制作,iis怎么部署网站1.TCP 三次握手之为什么要三次呢#xff1f;事不过三#xff1f; 过程如下图#xff1a; 先来解释下上述的各个标志的含义 序列号seq#xff1a;占4个字节#xff0c;用来标记数据段的顺序#xff0c;TCP把连接中发送的所有数据字节都编上一个序号#xff0c;第一个字节…1.TCP 三次握手之为什么要三次呢事不过三 过程如下图 先来解释下上述的各个标志的含义 序列号seq占4个字节用来标记数据段的顺序TCP把连接中发送的所有数据字节都编上一个序号第一个字节的编号由本地随机产生给字节编上序号后就给每一个报文段指派一个序号序列号seq就是这个报文段中的第一个字节的数据编号。 确认号ack占4个字节期待收到对方下一个报文段的第一个数据字节的序号序列号表示报文段携带数据的第一个字节的编号而确认号指的是期望接收到下一个字节的编号因此当前报文段最后一个字节的编号1即为确认号。 确认ACK占1位仅当ACK1时确认号字段才有效。ACK0时确认号无效 同步SYN连接建立时用于同步序号。当SYN1ACK0时表示这是一个连接请求报文段。若同意连接则在响应报文段中使得SYN1ACK1。因此SYN1表示这是一个连接请求或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1握手完成后SYN标志位被置0。 终止FIN用来释放一个连接。FIN1表示此报文段的发送方的数据已经发送完毕并要求释放运输连接 ACK、SYN和FIN这些大写的单词表示标志位其值要么是1要么是0ack、seq小写的单词表示序号。 三次握手避免历史连接
当客户端连续发送多次建立连接的 SYN 报文然后在网络拥堵的情况就会发生客户端收到不正确的 ack 的情况。
具体过程如下 客户端先发送了 SYNseq 90 报文但是被网络阻塞了服务端并没有收到接着客户端又重新发送了 SYNseq 100 报文注意不是重传 SYN重传的 SYN 的序列号是一样的。 旧 SYN 报文比最新的 SYN 报文早到达了服务端那么此时服务端就会回一个 SYN ACK 报文给客户端此报文的确认号是 91901。 客户端收到后发行自己期望收到的确认号应该是 1001而不是 90 1于是就会回 RST 文。 服务端收到 RST 报文后就会中止连接。后续最新的 SYN 抵达了服务端后客户端与服务端就可以正常的完成三次握手了。 上述中的旧 SYN 报文称为历史连接TCP 使用三次握手建立连接的最主要原因就是防止历史连接初始化了连接。 简单来说三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
2.如果是两次握手连接就无法阻止历史连接那为什么 TCP 两次握手为什么无法阻止历史连接呢 因为在两次握手的情况下被动发起方没有中间状态给主动发起方来阻止历史连接导致被动发起方可能建立一个历史连接造成资源浪费。 两次握手的情况下被动发起方在收到 SYN 报文后就进入 ESTABLISHED 状态意味着这时可以给对方发送数据给但是主动发起方此时还没有进入 ESTABLISHED 状态假设这次是历史连接主动发起方判断到此次连接为历史连接那么就会回 RST 报文来断开连接而被动发起方在第一次握手的时候就进入 ESTABLISHED 状态所以它可以发送数据的但是它并不知道这个是历史连接它只有在收到 RST 报文后才会断开连接。 两次握手无法阻止历史连接 上面这种场景下被动发起方在向主动发起方发送数据前并没有阻止掉历史连接导致被动发起方建立了一个历史连接又白白发送了数据妥妥地浪费了被动发起方的资源。 因此要解决这种现象最好就是在被动发起方发送数据前也就是建立连接之前要阻止掉历史连接这样就不会造成资源浪费而要实现这个功能就需要三次握手。 客户端在 SYN_SENT 状态下收到不正确的确认号的 synack 报文会回 RST 报文。 3.TCP 三次握手中客户端收到的第二次握手中 ack 确认号不是自己期望的会发生什么是直接丢弃 or 回 RST 报文
回 RST 报文。
4.什么情况下会收到不正确的 ack第二次握手中的 ack 呢 当客户端发起多次 SYN 报文然后网络拥堵的情况下旧的 SYN 报文比新的 SYN 报文早抵达服务端此时服务端就会按照收到的旧的 SYN 报文回复 synack 报文而此报文的确认号并不是客户端期望收到的于是客户端就会回 RST 报文。
5.四次挥手 客户端发送FIN包询问服务器端是否能断开客户端进入FIN_WAIT_1状态 服务器端收到客户端发送的包并返回ACK包服务器端进入CLOSE_WAIT状态 服务器端准备好断开后发送FIN包给客户端服务器端进入LAST_ACK状态 客户端收到服务器端发送的包后返回ACK包客户端进入TIME_WAIT状态服务器端收到包后进入CLOSED状态 客户端状态FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT 服务器端状态CLOSE_WAIT LAST_ACKC LOSED
6.为什么A在TIME-WAIT状态必须等待2MSL最大报文生存时间的时间 首先保证A发送的最后一个ACK报文段能够到达B保证A、B正常进入CLOSED状态。 这个ACK报文段有可能丢失使得处于LAST-ACK状态的B收不到对已发送的FINACK报文段的确认B超时重传FINACK报文段A能2MSL时间内收到这个重传的FINACK报文段接着A重传一次确认同时重启2MSL计数器2MSL时间后A和B进入CLOSE状态如果A在TIME-WAIT状态时接收到B的FINACK报文段之后向B发出确认报文段而不再确认B是否收到立即进入CLOSED状态如若B并没有正常收到A 的确认报文段则B无法正正常进入到CLOSED状态。 其次防止“已经失效的连接请求报文段”出现在本连接中。 A在发送完最后一个ACK报文段并经过2MSL会使本次连接持续时间内所有产生的报文段消失保证在下一次新连接中不会出现旧连接遗留的请求报文段。