TCP/IP
网络七层协议 OSI Open System InterConnection
OSI 是一个开放性的通讯系统互连参考模型
- 层级关系
- 物理层 网络硬件
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
- 其中高层(7、6、5、4)定义了应用程序的功能
- 下三层(3、2、1)主要面向通过网络端到端,点到点的数据流
TCP
TCP(Transmissions Control Protocol) 一种面向链接的,可靠的,基于字节流的传输协议层通信协议
- TCP 在传输层上运行,负责维护整个网络上可靠的端到端通信
- 传输层的还有
- UDP 用户数据报文协议
- RTP 实时传输协议
- SCTP 流控制传输协议
- 传输层的还有
- IP 是网络层协议,它在传输层下方
数据传送
在每个 TCP 报文段中都有一对 消息序号
和 消息确认号
- TCP 报文发送者称自己的字节流的编号为
消息序号
- TCP 报文接收者的字节流编号为
消息确认号
- 通过使用序列号和确认号,TCP 层可以把收到的报文段中的字节按正确的顺序交付给应用层
建立连接 三次握手
- 客户端向服务端发送 SYN 包,请求主动打开
- 该包携带随机数 A 作为消息序号
- 状态变化
- 服务端对新客户端都处于 Listen(等待响应)状态
- 发送完成后,客户端的状态更改为 SYN-SENT(同步已发送)
-
服务端接收到一个 SYN 包后
- 把该包放入 SYN 队列中
-
发送一个 SYN/ACK 包,并携带
- 消息序号 随机数 B
- 消息确认号 A+1
- 状态变化
- 服务端状态 LISTEN -> SYNC_RCVD(同步已收到)
- 客户端状态 ESTABLISHED(建立连接)
- 客户端收到 SYN/ACK 包后
- 发送一个 ACK 包
- 序号 A+1
- 确认码 B+1
- 状态变化
- 服务端、客户端 都为 ESTABLISHED
- 发送一个 ACK 包
- 当服务端接收到这个 ACK 包后
- 把请求帧从 SYN 队列中移出,放入到 Accept 队列中
- 这时已是长连接状态,可以进行数据传输了
SYN - synchronization (同步)
seq - sequcence (序号)
SYN-SENT - synchronization_sent (同步已发送)
SYNC_RCVD - synchronization_recieved (同步已收到)
ACK - acknowledgement (确认)
ESTABLISHED
FIN - finis (终结)
数据中断后重发
四次挥手
-
客户端发送连接释放包 FIN=1 seq=u 并停止发送数据
- 状态
- 客户端 FIN-WAIT-1(终止待待 1)
- 状态
-
服务端收到连接释放包,发出确认释放包 ACK=1 ack=u+1 seq=v
- 状态
- 服务端 发送后 CLOSE_WAIT
- 客户端 接收后 FIN-WAIT-2
- 状态
-
服务端最后向客户端发送包 FIN=1,ACK=1,ack=u+1,seq=w
- 状态
- 服务端 发送后 LAST_ACK(最终动作)
- 客户端 收到后 TIME_WAIT
- 状态
-
客户端收到服务端连接释放包 发送 ACK=1,ack=w+1,seq=u+1
- 状态
- 服务端 CLOSED
- 客户端 等待 2MSL 后 CLOSED
- 状态
规则-有助于记住
- 每次通讯都必须带有 seq 序列码。每一次通讯,状态值都会改变
- SYN=1 在握手阶段双方各发一次,FIN=1 在挥手阶段双方各发一次
- 有确认码的时候,必有确认号 ack。ack 在上一条收到的序号上+1
数据包结构
- 来源连接端口,16 位长,识别发送连接端口
- 目的连接端口,16 位长,识别接收连接端口
- 序列号(seq,32 位长)
- 确认号(ack,32 位长),期望收到的数据的开始序列号,也即已经收到的数据的字节长度加 1
- 资料偏移(4 位长),以 4 字节为单位计算出的数据段开始地址的偏移值。
- 保留,须置 0
- ACK—为 1 表示确认号字段有效
- SYN—为 1 表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
- FIN—为 1 表示发送方没有数据要传输了,要求释放连接
- RST—为 1 表示出现严重差错。可能需要重新创建 TCP 连接。还可以用于拒绝非法的报文段和拒绝连接请求
- 紧急指针(16 位长)—本报文段中的紧急数据的最后一个字节的序号
- 窗口(WIN,16 位长)—表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制
- 校验和(Checksum,16 位长)—对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。这是一个强制性的字段
参见