Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于TCP/IP协议的学习笔记 #5

Open
wanCheng7 opened this issue Nov 26, 2019 · 0 comments
Open

关于TCP/IP协议的学习笔记 #5

wanCheng7 opened this issue Nov 26, 2019 · 0 comments

Comments

@wanCheng7
Copy link
Owner

wanCheng7 commented Nov 26, 2019

TCP为什么要进行3次握手和4次挥手

TCP有6种标识:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急)

TCP建立连接的三次握手

image

  • 第一次握手

客户端向服务端发出请求连接报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,客户端进入SYN-SENT(同步已发送状态),表示客户端想要和服务端建立连接

  • 第二次握手

服务器收到请求报文之后如果同意连接,则发出确认报文,应答报文中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED (同步收到) 状态。

  • 第三次握手

当客户端收到同意连接的报文之后,还要向客户端发送一个确认报文,确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端发送这个报文之后进入ESTABLISHED(已建立连接)状态。

为什么要进行三次握手呢,两次不就够了吗

我们先来看看一种极端情况,客户端发送了第一次握手的请求报文,但是由于网络不好等原因,这个请求没有立即到达服务器,而是滞留了一段时间之后才到达服务器

对于这个已经失效的报文,服务端还是会做回应,这个时候,如果两次就建立了TCP连接,那接下来服务端就要一直等待客户端的数据,可是对客户端来说这早已是一条失效的请求,所以不会有数据,所以会浪费服务端的资源。

但是三次握手就不存在这个问题了,第二次握手时,客户端就不会对这个无效请求进行回应了,就不会建立TCP连接了。

所以,总体来说,之所以要三次握手,是为了让服务端通过第三次握手最后确认建立TCP连接,避免造成服务端资源的浪费,避免上面这种情况发生。

TCP断开连接的四次挥手

image

  • 第一次挥手

客户端认为数据发送完成,它就向服务端发起连接释放请求,此时,客户端进入FIN-WAIT-1(终止等待1)状态。

  • 第二次挥手

服务端收到连接释放请求后,会告诉应用层释放TCP连接,人庵后会发送ACK包,并进入CLOSE_WAIT 状态,表示客户端到服务端的连接已经释放,服务端不再接受客户端发的数据了,但是TCP是双向连接的,所以服务端仍然可以向客户端发送数据。

  • 第三次挥手

服务端如果还有没发完的数据会继续发送,完毕后服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接,服务端进入 LAST-ACK 状态。

  • 第四次挥手

客户端收到释放请求后,向服务端发送确认应答,此时客户端进入TIME-WAIT 状态。当服务端收到确认应答之后进入CLOSED 状态。

参考:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant