TCP

TCP协议位于传输层,传输层协议接收来自应用层协议的数据,封装上相应的传输层头部,帮助其建立"端到端"(Port to Port)的连接

传输层的PDU被称为Segment(段)

   

TCP的报文格式

TCP报文头部字段说明:

  • Source Port:源端口,标识哪个应用程序发送
  • Destination Port:目标端口,标识哪个应用程序接收
  • Sequence Number:序列号,TCP连接中传输的数据流每个字段都编上一个序列号。序列号字段的值指的是本报文段所发送数据的第一个字节的序号
  • Acknowledgment Number:确认序列号,是期望收到对方下一个报文段数据的第一个字段的序号,即上次已成功接收到的数据段的最后一个字节数据的序号加1
  • Header Length:头部长度,指出TCP报文头部长度
  • Reserved:保留,必须填0
  • Control bits:控制位
    • URG:紧急指针标志,为1时表示紧急指针有效
    • ACK:确认序号标志,为1时表示确认号有效
    • PSH:push标志,为1时表示带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队
    • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求
    • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应带捎带一个确认,即SYN=1和ACK=1
    • FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流
  • Window:窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数
  • Checksum:校验字段,是一个强制性字段,由发端计算和存储,并由收端进行验证。在计算校验和是,要包括TCP头部和TCP数据,同时在TCP报文段的前面加上12字节的伪头部
  • Urgent:紧急指针,只有当URG标志为1时,紧急指针才有效。
  • Options:选项字段(可选)

   

TCP端口号

  • 客户端使用的源端口一般是随机分配,目标端口则由服务器的应用指定
  • 端口号一般为系统中未使用的,且大于1023
  • 目的端口号为服务端开启的应用(服务)所侦听的端口,如HTTP缺省使用80

   

TCP连接的建立 - 三次握手

TCP连接建立的详细过程:

  1. 由TCP连接放发起(图中PC1),发送第一个SYN=1的TCP报文,初始序列号a为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认号为0
  2. 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYN=1,ACK=1的TCP报文。初始序列号b为一个随机生成的数字,同时因为此报文的回复PC1的报文,所以确认序列号为a+1
  3. PC1接收到PC2发送的SYN=1和ACK=1的TCP报文后,回复一个ACK=1的报文,此时序列号为a+1,确认序列号为b+1。PC2收到后,TCP双向连接建立

   

TCP连接下报文的传输过程

TCP使用序列号和确认序列号字段实现数据的可靠和有序传输

PC1给PC2发送一段数据,传输过程:

  1. PC1将全部待TCP发送的数据按照字节为单位编上号。假设第一个字节的编号为"a+1",第二个字节的序号为"a+2",依次类推
  2. PC1会把每一段数据的第一个字节编号作为序列号,然后将TCP报文发送出去
  3. PC2在接收到PC1发送来的TCP报文后,需要给予确认同时请求下一段数据,如何确定一下段数据?序列号(a+1) + 载荷长度 = 下一段数据的第一个字节的序号(a+1+12)
  4. PC1在收到PC2发送的TCP报文之后,发现确认序列号为"a+1+12",说明"a+1"到"a+12"这一段的数据已经被接受,需要从"a+1+12"开始发送

为了提升发送效率,也可以一次性发送多段数据,由接收方同一确认

   

TCP的窗口滑动机制

TCP通过滑动窗口机制来控制数据的传输速率

  1. 在TCP三次握手建立连接时,双方都会通过Window字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)
  2. 连接建立成功之后,发送方会根据接收方宣告的Window大小发送相应字节数的数据
  3. 接收方接收到数据之后会放在缓冲区内,等待上层应用来取走缓冲区的数据。若数据被上层取走,则相应的缓冲空间被释放
  4. 接收方根据自身缓冲空间大小通告当前的可以接收的数据大小(window)
  5. 发送方根据接收方当前的Window大小发送相应的数据

   

TCP连接的关闭 - 四次挥手

当数据传输完成,TCP需要通过"四次挥手"机制断开TCP连接,释放系统资源

数据传输完毕后,两个方向的连接必须都关闭,具体过程:

  1. 由PC1发出一个FIN=1的不带数据的TCP报文
  2. PC2收到PC1发来的FIN=1的TCP报文后,会回复一个ACK=1的TCP报文
  3. 若PC2也没有需要发送的数据,则直接发送FIN=1的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN=1的TCP报文去关闭连接
  4. PC1收到FIN=1的TCP报文,回复ACK报文,TCP双向连接断开

   

posted @ 2022-09-09 11:39  hongliang888  阅读(127)  评论(0编辑  收藏  举报