一.TCP/IP协议介绍
共定义了四层,和OSI七层参考模型的分层有对应关系
官方分成了四层:
- 应用层
- 传输层
- 互联网
- 网络接口层
关于TCP协议
- TCP是面向连接的、可靠的进程到进程通信的协议
- TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存和接收缓存,用来临时存储数据
TCP报文段
下面我们了解一下报文各个部分的含义
- 源端口号:是发送方进程对应的端口号
- 目标端口号:是接收方的端口号
- 序号:将所有的数据分片,并编上编号
- 确认号(ack):发送方给接收方发送消息时,每一个数据包里有一个序号,里面有一个确定号,当接收方给发送方回消息的时候会发送这个确定号,以确定所有的数据都已经收到
- 首部长度:就是整个TCP报文的长度(20-60)字节
- 保留:作为今后的扩展功能用,暂时还没有用到,是空的
- 控制位:控制位非常重要,TCP的连接、传输和断开都受到这几个控制位的指挥
- URG(紧急位):当URG=1时,紧急指针有效,表示本报文段中发送的数据包含紧急数据(特殊情况下)
- ACK(确认位):当ACK=1时,确定目前处于连接状态
- PSH(急切位):当RSH=1时,要求接收方尽快将数据段传送到应用层(正常状态下)
- RST(重置位):当RST=1时,重新建立和接收方的连接
- SYN(同步位):当SYN=1时,请求建立连接
- FIN(断开位):当FIN=1时,请求断开连接
- 窗口值:表示本地可接收数据段的数目,这个值得大小是可变的,TCP协议中的流量控制机制就是依靠变化窗口值的大小实现的
- 校验和:校验在传输过程中数据有没有损坏、篡改
- 紧急指针:和URG配合使用,当URG=1时有效
- 选项:在TCP首部可以有多达40字节的可选信息
拓展:
-
pid号:系统每开启一个进程会自动分配一个pid号给这个进程,方便系统性管理
-
所有的系统都是从1开始
-
端口号:区别两个系统之间的进程
-
服务端:端口号约定不会轻易改变(iana 组织规定 前1000左右)服务端会开启监听的进程
-
客户端:端口随机生成
三.TCP的特性
- 工作在传输层
- 面向连接协议-----在源点和终点之间建立一条虚连接
- 全双工协议-----数据可在同一时间双向传输
- 半关闭-----在TCP断开连接的时候有一个半关闭状态
- 错误检查-----控制位RST控制
- 将数据打包成段,排序-----报文中序号的控制
- 确认机制-----报文中确认号控制
- 数据恢复,重传-----控制位RST控制
- 流量控制,滑动窗口-----报文中窗口值的大小控制
四.TCP三次握手
TCP建立连接的过程称为三次握手
第一次握手
- PC1向PC2发送建立连接的请求,此时就需要发送请求连接的申请,此过程的典型标志就是控制位SYN=1,还有数据字节分片的序号seq,这里假设是X
第二次握手
这一部分其实是分两部分完成的
- PC2收到PC1的请求,向PC1回复一个消息确认连接,此过程的典型标志就是控制位ACK=1,还有一个回复的确认号ack,确认号的值是PC1发给PC2时的序列号加1,也就是ack=X+1
- 此时PC2也会向PC1发起建立连接的请求,这个过程就和第一次握手一样,典型标志就是控制位SYN=1,还有数据字节分片的序号seq,这里假设是y
第三次握手
- PC1收到PC2确认连接和请求连接的回复,也会像PC2回复一个确认连接的消息,此时典型标志的控制位就是ACK=1,确认号是PC2发送消息的序号加1,就是y+1,还有自己发送的数据的分片序号就是第一次握手时的序号加1,就是X+1
有限状态机(扩展)
-
CLOSED 没有任何连接状态
-
LISTEN 侦听状态,等待来自远方TCP端口的连接请求 (服务开启 http(进程) 80端口在帮进程 看着 有没有人找 http )
-
SYN-SENT 在发送连接请求后,等待对方确认
-
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
-
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
-
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
-
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
-
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
-
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
-
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
-
CLOSING 双方同时尝试关闭传输连接,等待对方确认
总结
为什么TCP建立连接时是三次握手而不是四次握手或者两次握手呢?
这就和我在说第二次握手时由两部分完成的有关了
因为有来有回才是一次通信,第一次握手PC1给PC2发送请求是一次去程,PC2给PC1回复同意的消息是一次回程
并且这次也有一个请求时,对于PC2来说这条消息也是对PC1的一次去程,当第三次握手时,PC1给PC2回复确认的消息就是一次回程
这样就建立了两次通信
如果是两次握手就太少,四次握手就太多