TCP/IP的三次握手以及四次挥手、TCP的十一种状态集转换
TCP:传输控制协议、面向连接网络协议
优点:数据传输可靠性高
缺点:数据通讯效率低
应用:文件传输 邮件传输 网站页面数据传输
举例:
A主机 向 B主机 传输数据
B主机收到后会有一个确认机制,会向A主机进行回复确认
**UDP:**用户报文协议 无;连接网络协议
优点:数据通讯效率高 没有确认机制
缺点:数据安全性无法保证
应用:DNS解析服务 视频数据传输 语音数据传输
举例:
A主机向B主机发送数据包,A主机不会管B主机有没有收到。
TCP三次握手过程
TCP报文结构:如何包装和封装数据
控制字段:对网络通讯有控制管理作用 0关闭 1开启
syn:请求建立连接字段
fin:请求断开连接字段
ack:传输的数据确认控制字段
端口号:22(ssh) 23(telnet) 20(FTP) 21(FTP) 80(网站) 25 111 873 3306(数据库) 3389
端口号范围:1~65535(tcp udp都不使用0号端口)
总结:
第一次握手:
发送请求连接控制字段syn , 请求建立连接 (客户端 — 服务端)
根据数据包编号发送数据 seq=x
第二次握手:
发送确认控制字段ack 和 请求连接控制字段 syn (服务端 — 客户端)
根据数据包编号进行确认 ack=x+1
根据数据包编号发送数据 seq=y
第三次握手:
发送确认控制字段ack (客户端 — 服务端)
根据数据包编号进行确认 ack=y+1
根据数据包编号发送数据 seq=x+1
syn位:请求建立连接字段
fin位:请求断开连接字段
ack位:传输的数据确认控制字段
为了保证将大的数据进行分割后的传输
seq号 ***:数据编号 便于重组数据
ack 确号 认号:确认下一次发送数据包编号
控制字段:对网络通讯有控制管理作用 0关闭 1开启
(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方seq+1,两端配对。
建立连接以后 传输数据时就一直带着控制字段了,ack=1
***:数据编号 便于重组数据
确认号:确认下一次发送数据包编号
TCP四次挥手过程
总结:
第一次挥手:
发送请求断开控制字段fin 和 确认控制字段 (客户端 — 服务端)
第二次挥手:
发送确认控制字段ack (服务端 — 客户端)
第三次挥手:
发送请求断开控制字段fin 和 确认控制字段 (服务端 — 客户端)
第四次握手:
发送确认控制字段ack (客户端 — 服务端)
提问:为什么TCP握手是三次,挥手是四次?
解答:因为挥手时需要数据传输确认阶段
有没有可能三次挥手?
有可能,是因为省略了第二次挥手
抓取三次握手的包:
抓取四次挥手的包:
抓取三次挥手数据包:
TCP/IP模型和OSI7层模型的对比
TCP十一种状态集
应用:高并发网络场景时,linux系统中的网络优化
十一种状态集说明:
三次握手 (五种状态)
客户端初始状态:closed
服务端初始状态:closed—listen
第一次握手:发送syn信息 客户端----服务端
客户端 closed — syn_sent
第二次握手 发送syn ack信息 服务端—客户端
服务端状态: listen—syn_rcvd
第三次握手:发送ack信息 客户端–服务端
客户端状态:syn_sent ---- established
服务端状态 syn_rcvd — established
四次挥手(六种状态)
客户端初始化状态:established
服务端初始化状态:established
正常情况:
第一次挥手:发送fin ack 信息 客户端—服务端
客户端:fin_wait1
第二次挥手:发送ack信息 服务端—客户端
服务端状态:established ---- close_wait
客户端状态:fin_wait1 — fin_wait2
第三次挥手:发送fin ack信息 服务端—客户端
服务端状态:close_wait — last_ack
第四次挥手:发送ack信息 客户端—服务端
客户端状态:fin_wait2 – time_wait
服务端状态:last_ack —closed
特殊情况:
第一次挥手: 发送fin ack信息 客户端 — 服务端
客户端状态:established —> fin_wait1
第二次挥手:发送fin ack信息 服务端 — 客户端
客户端状态:fin_wait1 —> closing
服务端状态:close_wait —> last_ack
第四次挥手:发送ack信息 客户端 — 服务端
客户端状态:closing —> time_wait —> closed
服务端状态:last_ack —> closed
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;