TCP协议

83 阅读5分钟

一.TCP/IP协议介绍

image.png 共定义了四层,和OSI七层参考模型的分层有对应关系

官方分成了四层:

  • 应用层
  • 传输层
  • 互联网
  • 网络接口层

关于TCP协议

  • TCP是面向连接的、可靠的进程到进程通信的协议
  • TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存和接收缓存,用来临时存储数据

TCP报文段

image.png 下面我们了解一下报文各个部分的含义

  • 源端口号:是发送方进程对应的端口号
  • 目标端口号:是接收方的端口号
  • 序号:将所有的数据分片,并编上编号
  • 确认号(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的特性

  1. 工作在传输层
  2. 面向连接协议-----在源点和终点之间建立一条虚连接
  3. 全双工协议-----数据可在同一时间双向传输
  4. 半关闭-----在TCP断开连接的时候有一个半关闭状态
  5. 错误检查-----控制位RST控制
  6. 将数据打包成段,排序-----报文中序号的控制
  7. 确认机制-----报文中确认号控制
  8. 数据恢复,重传-----控制位RST控制
  9. 流量控制,滑动窗口-----报文中窗口值的大小控制

四.TCP三次握手

TCP建立连接的过程称为三次握手

第一次握手

image.png

  • PC1向PC2发送建立连接的请求,此时就需要发送请求连接的申请,此过程的典型标志就是控制位SYN=1,还有数据字节分片的序号seq,这里假设是X

第二次握手

image.png 这一部分其实是分两部分完成的

  • PC2收到PC1的请求,向PC1回复一个消息确认连接,此过程的典型标志就是控制位ACK=1,还有一个回复的确认号ack,确认号的值是PC1发给PC2时的序列号加1,也就是ack=X+1
  • 此时PC2也会向PC1发起建立连接的请求,这个过程就和第一次握手一样,典型标志就是控制位SYN=1,还有数据字节分片的序号seq,这里假设是y

第三次握手

image.png

  • PC1收到PC2确认连接和请求连接的回复,也会像PC2回复一个确认连接的消息,此时典型标志的控制位就是ACK=1,确认号是PC2发送消息的序号加1,就是y+1,还有自己发送的数据的分片序号就是第一次握手时的序号加1,就是X+1

有限状态机(扩展)

  1. CLOSED 没有任何连接状态
    
  2. LISTEN 侦听状态,等待来自远方TCP端口的连接请求 (服务开启 http(进程) 80端口在帮进程 看着 有没有人找 http )
    
  3. SYN-SENT 在发送连接请求后,等待对方确认
    
  4. SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
    
  5. ESTABLISHED 代表传输连接建立,双方进入数据传送状态
    
  6. FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
    
  7. FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
    
  8. TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
    
  9. CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
    
  10. LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
    
  11. CLOSING 双方同时尝试关闭传输连接,等待对方确认
    

总结

为什么TCP建立连接时是三次握手而不是四次握手或者两次握手呢?

这就和我在说第二次握手时由两部分完成的有关了
因为有来有回才是一次通信,第一次握手PC1给PC2发送请求是一次去程,PC2给PC1回复同意的消息是一次回程
并且这次也有一个请求时,对于PC2来说这条消息也是对PC1的一次去程,当第三次握手时,PC1给PC2回复确认的消息就是一次回程
这样就建立了两次通信
如果是两次握手就太少,四次握手就太多