TCP/IP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的 可靠 的、基于字节流的传输层通信协议
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是一种无连接的传输层协议
TCP 传输控制协议 面向连接的协议(同步传输) 可靠传输协议 传输效率低 na
UDP 用户报文协议 无连接协议 (异步传输) 不可靠传输协议 传输效率高
系统中:
异步传输数据: 类似离线传输 不需要进行确认
优点: 传输效率较高
缺点: 安全性不高
同步传输数据: 类似在线传输 需要进行确认
优点: 安全性高
缺点: 传输效率较低
1.TCP协议中重要原理
1) TCP三次握手过程 -- 完成网络连接建立
TCP报文结构:
a 源端口地址 返回数据包目标端口地址
b 目标端口地址 要和服务端哪个网络服务建立连接
端口的数值范围: 1-65535 是通过报文结构获知的
根据报文结构 源端口和目标端口各占用16个bit
公式: 2的n次方 n占用了多少比特
占用了1bit
端口范围: 0 1 2种 2的1次方=2 0-1
占用了2bit
端口范围: 00(0) 01(1) 10(2) 11(3) 4种 2的2次方=4 0-3
占用了3bit
端口范围: 000(0) 001(1) 010(2) 011(3) 100(4) 101(5) 110(6) 111(7) 8种 2的3次方=8 0-7
占用了16bit
端口范围: 2的16次方=65536 0-65535 --- 1-65535
PS: 一般0号端口不被使用
c Sequence Number(序列号)
d Acknowledgement Number(确认号)
特殊6bit作为报文结构中的控制位:
syn(连接) --- 请求建立连接控制字段
ack(确认) --- 表示确认控制字段
fin(断开) --- 请求断开连接控制字段
说明: 控制字段数值置为1表示控制功能开启 默认为0
三次握手详细过程:
第一次握手: 发送TCP数据报文 客户端 -- 服务端
a TCP数据报文中,需要将syn控制字段改为1
b TCP数据报文中,需要将seq序列号信息发出 seq=x
第二次握手: 发送TCP数据报文 服务端 -- 客户端
a TCP数据报文中,需要将ack控制字段改为1
b TCP数据报文中,同时将syn控制字段改为1
c TCP数据报文中,同时将ack确认号信息发出 ack=x+1
d TCP数据报文中,同时将seq序列号信息发出 seq=y
第三次握手: 发送TCP数据报文 客户端 -- 服务端
a TCP数据报文中,需要将ack控制字段改为1
b TCP数据报文中,同时将ack确认号信息发出 ack=y+1
c TCP数据报文中,同时将seq序列号信息发出 seq=x+1
2.TCP四次挥手过程 -- 完成网络连接断开
第一次挥手: 发送TCP数据报文 客户端 -- 服务端
a TCP数据报文中, 需要将fin控制字段改为1
b TCP数据报文中, 同时将ack控制字段改为1
也包含seq和ack确认号信息
第二次挥手: 发送TCP数据报文 服务端 -- 客户端
a TCP数据报文中, 需要将ack控制字段改为1
第三次挥手: 发送TCP数据报文 服务端 -- 客户端
a TCP数据报文中, 需要将ack控制字段改为1
b TCP数据报文中, 同时将fin控制字段改为1
第四次挥手: 发送TCP数据报文 客户端 -- 服务端
a TCP数据报文中, 需要将ack控制字段改为1
扩展: 如何抓取网络数据包(抓包软件)
windows: Wireshark
linux: tcpdump命令
3. TCP 11种状态集转换(了解 -- 架构层面)
1) 以后可以更好排查系统网络问题
2) 以后学习网络编程会有帮助
TCP三次握手过程: 服务端和客户端状态变化(5种状态变化)
第一历程: 初始状态信息
客户端状态为: closed
服务端状态为: closed
第二历程: 服务端开启相应服务
服务端状态为: closed -- LISTEN
第三历程: 发送建立连接请求(客户端) == 三次握手第一次
客户端发送syn信息
客户端状态为: closed -- syn_sent
第四历程: 接收建立连接请求(服务端) == 三次握手第二次
服务端接受syn信息, 发送确认以及请求建立连接信息(ack syn)
服务端状态为: LISTEN -- syn_rcvd
第五历程: 发送最后确认信息(客户端) == 三次握手第三次
客户端发送ack信息
客户端状态为: syn_sent -- established
第六历程: 接收最后确认信息(服务端)
服务端接收ack信息
服务端状态为: syn_rcvd -- established
结论: 只有服务端和客户端都统一处于established连接建立状态, 才能正常传输数据信息
TCP四次挥手过程: 服务端和客户端状态变化(5种状态变化)
第一个历程: 初始状态信息
客户端状态为: established
服务端状态为: established
第二个历程: 发送断开连接请求(客户端) == 四次挥手第一次
客户端发送fin请求断开连接字段
客户端状态为: established -- fin_wait1
第三个历程: 接收断开连接请求(服务端) == 四次挥手第二次
服务端接受fin请求断开连接字段 发出确认信息(ack=1)
服务端状态为: established -- close_wait
第四个历程: 接收确认断开信息(客户端)
客户端接受服务端发出的确认信息(ack=1)
客户端状态为: fin_wait1 -- fin_wait2
第五个历程: 发送断开连接请求(服务端) == 四次挥手第三次
服务端发送fin请求断开连接字段 同时还会再次发送确认字段
服务端状态为: close_wait -- last_ack
第六个历程: 接收断开连接请求(客户端) 发送最后确认信息 == 四次挥手第四次
客户端接收断开连接请求 同时发送最后确认信息ack=1
客户端状态为: fin_wait2 -- time_wait (等时间 60s 90s 120s???)
第七个历程: 接收最后确认信息(服务端)
服务端状态为: last_ack -- closed
第八个历程: 等待时间结束
客户端状态为: time_wait -- closed