首先我们要清楚TCP是传输层的协议,传输层的功能就是负责端到端的传输。
接下来看一下TCP的三次的三次握手和四次挥手的流程图
一.TCP的三次握手
在进行TCP的三次握手建立连接之前,客户端和服务端都要做一定的工作。
- 初始化工作:
1.客户端:客户端刚开始处于CLOSED状态,首先要创建socket,然后进行accept的连接请求。(这里客户端不需要手动的绑定地址,因为客户端在发送数据的时候具体哪个端口号和地址信息都无所谓,只要发送成功就行。如果手动绑定地址有可能会造成失败,得不偿失)
2. 服务端:服务端刚开始处于CLOSED状态。首先创建socket,然后进行绑定地址(bind),在进行监听(listen),当服务端监听后,则服务端处于LISTEN状态。最后accept阻塞等待客户端连接。
- 开始连接过程
1.客户端向服务端发送一个SYN请求,这时候客户端会阻塞等待服务端应答,这时候客户端会从CLOSED状态变为SYN_SENT状态(这是第一次握手)
2.服务端收到客户端的SYN连接请求后,向客户端回复SYN+ACK(表示同意建立连接),这时候服务端会从LISTEN状态变为SYN_RCVD状态(这是第二次握手)
3.当客户端收到服务端的SYN+ACK回复的回复后,会从connect()返回,同时会向服务端发送一个ACK回复,客户端会从SYN_SENT状态变为ESTABLISHED状态这时候表示连接建立成功。(这是第三次握手)
- 面对TCP三次握手的常见的一些问题 (以后碰到相关问题会继续添加)
1.建立连接为什么是三次???
a)如果是一次这个显然不太可能,如果客户端只是给服务端发送SYN连接请求,但是服务端不给客户端回复,那么客户端会以为连接请求没有发送到就会继续发送,如果服务端一直没有接收到,那么就会直接返回一个错误,这样根本建立不了连接
b) 如果是两次。客户端向服务端发送SYN请求,然后服务端向客户端发送SYN+ACK回复。如果没有客户端给服务端最后一次发送ACK回复,那么客户端会认为服务端没有收到客户端第一次发送SYN请求,会继续向服务端发送SYN请求,那么服务端就会创建新的socket去向客户端发送回复,这样会造成资源浪费。
c)如果是四次那就没有那个必要了。
所以说TCP必须得三次握手建立连接
2.对TCP三次握手时,SYN的泛洪攻击的了解
博客:https://blog.youkuaiyun.com/alidada_blog/article/details/83386144
3. 如果第三次握手失败了会怎样???
当客户端收到服务端发送的SYN+ACK回复后,向服务端发送ACK回复,但是服务端没有收到,那么客户端会主动关闭这个连接,避免资源浪费
二.TCP的四次挥手
- 四次挥手的过程
1.如果客户端没有别的请求了,那么就会调用close()进行关闭连接,客户端会向服务端发送一个FIN包,这时候客户端会处于FIN_WAIT_1状态(这是第一次挥手)
2.当服务端能收到这个FIN包后,服务端会回复一个ACK,同时read()会返回0,服务端处于CLOSE_WAIT状态。同时客户端处于FIN_WAIT_2状态,这时候服务端会等待一段时间将自己的事情处理完才会进行第三次。(这是第二次挥手)
3.read()返回之后,服务端就知道客户端关闭了连接 ,同时自己也调用close()关闭连接,这时候服务端会向可会端发送一个FIN包,服务端处于LAST_ACK状态(这是第三次挥手)
4.客户端在收到FIN包后会给服务端回复一个ACK,可会端会变为TIME_WAIT状态(这是第四次挥手)
- TCP四次挥手常见的问题
1.主动关闭方TIME_WAIT需要等待多长时间???为什么需要两个MSL时间???
TIME_WAIT是主动关闭方出现的,当主动关闭方收到服务端发送的FIN包后向服务端发送ACK后出现的状态
TIME_WAIT需要等待两个MSL(最大报文生存周期)的时间
客户端在收到服务端发送的FIN包后回向服务端发送ACK回复,但是这个ACK有可能会丢掉,那么被动方会等待一段时间,当服务端没有收到ACK回复后,那么服务端就会认为可会端没有收到之前FIN包,服务端就会继续向可会断发送FIN包,在等待服务端发送FIN包的时候也是需要时间的。所以说需要等待两个MSL时间,这样可以保证FIN包的准确到达。
2.TIME_WAIT的作用是什么??
其作用是为了保护主动关闭方。
客户端在收到服务端发送的FIN包后回向服务端发送ACK回复,但是这个ACK有可能会丢掉,那么被动方会等待一段时间,当服务端没有收到ACK回复后,那么服务端就会认为可会端没有收到之前FIN包,服务端就会继续向可会断发送FIN包,如果客户端不等待服务端发送FIN包而是在收到ACK后直接关闭连接,那么客户端会继续建立新的socket,那么这个新的socket又可能会接收这个FIN包,会对其产生影响,这是我们不希望看到的,因此需要等待一段时间,让网络上迷途的报文彻底消失,防止对后续的连接产生影响。
3.断开连接为什么是四次???(四次挥手)
因为TCP连接是全双工的网络协议,允许同时通信的双方同时进行数据的收发,同样也允许收发两个方向的连接被独立关闭,以避免客户端数据发送完毕,向服务端发送FIN关闭连接,而服务端还有发送客户端的数据没有发送完毕的情况。所以关闭TCP连接需要进行四次握手,每次关闭一个方向上的连接需要FIN和ACK两次握手。
以上的总结如果有什么错误还希望大家能够给我指出,不胜感激!!!!!!!!!