什么网站时候做伪静态,山东建设工程信息网站,万网虚拟服务器怎么做网站内容,wordpress 301重定向插件1. TCP协议基础
网络编程基础见#xff0c;传送门
TCP是面向连接的#xff0c;无论哪一方向另一方发送数据之前#xff0c;都必须先在双方之间建立一条连接。 在TCP/IP协议中#xff0c;TCP协议提供可靠的连接服务#xff0c;连接是通过三次握手进行初始化的。 三次握手…1. TCP协议基础
网络编程基础见传送门
TCP是面向连接的无论哪一方向另一方发送数据之前都必须先在双方之间建立一条连接。 在TCP/IP协议中TCP协议提供可靠的连接服务连接是通过三次握手进行初始化的。 三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。
TCP网络传输示意图
2. 三次握手(3-Way Handshake) 第一次握手建立连接。 客户端发送连接请求报文段将SYN位置为1Sequence Number为x然后客户端进入SYN_SENT状态等待服务器的确认 第二次握手服务器收到SYN报文段。 服务器收到客户端的SYN报文段需要对这个SYN报文段进行确认设置Acknowledgment Number为x1(Sequence Number1)同时自己自己还要发送SYN请求信息将SYN位置为1Sequence Number为y 服务器端将上述所有信息放到一个报文段即SYNACK报文段中一并发送给客户端此时服务器进入SYN_RECV状态 第三次握手客户端收到服务器的SYNACK报文段。然后将Acknowledgment Number设置为y1向服务器发送ACK报文段这个报文段发送完毕以后客户端和服务器端都进入ESTABLISHED状态完成TCP三次握手。 完成了三次握手客户端和服务器端就可以开始传送数据。
问题
1.为什么要三次握手? 既然总结了TCP的三次握手那为什么非要三次呢怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢在谢希仁的《计算机网络》中是这样说的为了防止已失效的连接请求报文段突然又传送到了服务端因而产生错误。 在书中同时举了一个例子如下 “已失效的连接请求报文段”的产生在这样一种情况下 client发出的第一个连接请求报文段并没有丢失而是在某个网络结点长时间的滞留了以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段同意建立连接。 假设不采用“三次握手”那么只要server发出确认新的连接就建立了。由于现在client并没有发出建立连接的请求因此不会理睬server的确认也不会向server发送数据。但server却以为新的运输连接已经建立并一直等待client发来数据。这样server的很多资源就白白浪费掉了。 采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况client不会向server的确认发出确认。server由于收不到确认就知道client并没有要求建立连接。”
防止了服务器端的一直等待而浪费资源。
为什么是3次握手不是2次握手? start of a TCP conversation between Alice and Bob: Alice — Bob SYNchronize with my Initial Sequence Number of X Alice — Bob I received your syn, I ACKnowledge that I am ready for [X1] Alice — Bob SYNchronize with my Initial Sequence Number of Y Alice — Bob I received your syn, I ACKnowledge that I am ready for [Y1] 如果是2次握手只能单向通信1个发syn一个ack而事实上TCP是全双工双方都需要建立ISNInitial Sequence Number 彼此都需要知道对方的ISN 3次握手逻辑上是4次握手是有序的2次互通信
TCP connection is bidirectional. What this means is that it actually is a pair of one-way connections.The initiator sends SYN, the responder sends ACK:
one simplex connection begins.
“Then” the responder sends SYN, the initiator sends ACK:
another simplex connection begins.
Two simplex connections form one duplex TCP session
So logically there are four steps involved;
but because SYN and ACK flags are different “fields” of TCP header,
they can be set simultaneously - the second and the third steps (of the four) are combined,
so technically there are three packet exchanges.
Each simplex (half-)connection uses 2-way exchange, as you proposed.Each client will perform an active OPEN and then proceed through both the SYN-SENT and SYN-RECEIVED states until their SYNs are acknowledged.
This means there isn’t a “three-way handshake” any more as shown.
Instead, it is like two simultaneous “two-way handshakes”.
Each client sends a SYN, receives the other’s SYN and ACKs it, and then waits for its own ACK.
2. 四次结束(4-Way Handshake)
当客户端和服务器通过三次握手建立了TCP连接以后当数据传送完毕肯定是要断开TCP连接的啊。那对于TCP的断开连接这里就有了神秘的“四次分手”。 第一次分手主机1可以使客户端也可以是服务器端设置Sequence Number和Acknowledgment Number向主机2发送一个FIN报文段此时主机1进入FIN_WAIT_1状态这表示主机1没有数据要发送给主机2了 第二次分手主机2收到了主机1发送的FIN报文段向主机1回一个ACK报文段Acknowledgment Number为Sequence Number加1主机1进入FIN_WAIT_2状态主机2告诉主机1我“同意”你的关闭请求 第三次分手主机2向主机1发送FIN报文段请求关闭连接同时主机2进入LAST_ACK状态 第四次分手主机1收到主机2发送的FIN报文段向主机2发送ACK报文段然后主机1进入TIME_WAIT状态主机2收到主机1的ACK报文段以后就关闭连接此时主机1等待2MSL后依然没有收到回复则证明Server端已正常关闭那好主机1也可以关闭连接了。 至此TCP的四次分手就这么愉快的完成了。
为什么要四次分手? TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。 TCP是全双工模式这就意味着 当主机1发出FIN报文段时只是表示主机1已经没有数据要发送了主机1告诉主机2它的数据已经全部发送完毕了但是这个时候主机1还是可以接受来自主机2的数据 当主机2返回ACK报文段时表示它已经知道主机1没有数据发送了但是主机2还是可以发送数据到主机1的 当主机2也发送了FIN报文段时这个时候就表示主机2也没有数据要发送了就会告诉主机1我也没有数据要发送了之后彼此就会愉快的中断这次TCP连接。 如果要正确的理解四次分手的原理就需要了解四次分手过程中的状态变化。 FIN_WAIT_1: 这个状态要好好解释一下其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时它想主动关闭连接向对方发送了FIN报文此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后则进入到FIN_WAIT_2状态当然在实际的正常情况下无论对方何种情况下都应该马上回应ACK报文所以FIN_WAIT_1状态一般是比较难见到的而FIN_WAIT_2状态还有时常常可以用netstat看到。主动方 FIN_WAIT_2上面已经详细解释了这种状态实际上FIN_WAIT_2状态下的SOCKET表示半连接也即有一方要求close连接但另外还告诉对方我暂时还有点数据需要传送给你(ACK信息)稍后再关闭连接。主动方 CLOSE_WAIT这种状态的含义其实是表示在等待关闭。怎么理解呢当对方close一个SOCKET后发送FIN报文给自己你系统毫无疑问地会回应一个ACK报文给对方此时则进入到CLOSE_WAIT状态。接下来呢实际上你真正需要考虑的事情是察看你是否还有数据发送给对方如果没有的话那么你也就可以 close这个SOCKET发送FIN报文给对方也即关闭连接。所以你在CLOSE_WAIT状态下需要完成的事情是等待你去关闭连接。被动方 LAST_ACK: 这个状态还是比较容易好理解的它是被动关闭一方在发送FIN报文后最后等待对方的ACK报文。当收到ACK报文后也即可以进入到CLOSED可用状态了。被动方 TIME_WAIT: 表示收到了对方的FIN报文并发送出了ACK报文就等2MSL后即可回到CLOSED可用状态了。如果FINWAIT1状态下收到了对方同时带FIN标志和ACK标志的报文时可以直接进入到TIME_WAIT状态而无须经过FIN_WAIT_2状态。主动方 CLOSED: 表示连接中断。