网络协议-TCP

本文详细介绍了TCP协议,包括其面向连接、可靠的特性,利用序列号和确认号进行数据传输和错误检测,涉及滑动窗口原理、三次握手和四次挥手过程,以及客户端和服务端的状态转换流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • TCP
    • 传输控制协议 Transmission Control Protocol
  • 概述
    • 面向连接,可靠(差错校验),基于字节流,传输层协议
TCP头部结构

tcp-001.jpg

  • Sequence Number
    • TCP报文段序号,解决网络包乱序,以及数据重传
  • Acknowledgement Number
    • 发送方期望的下一个TCP段的seq number
  • Window
    • 著名的滑动窗口(Sliding Window),用于流量控制
    • 发送端
      • LastByteAcked
        • 已被接收端ACK的报文段
      • LastByteSent
        • 已发送出去的报文段,此时在网络传输中
      • LastByteWritten
        • 应用层正在写的位置
    • 接收端
      • LastByteRead
        • 应用层正在读的位置
      • NextByteExpected
        • 已接收连续报文段的位置
      • LastByteRcvd
        • 已接收最后一个报文段的位置
      • 中间空白
        • 还没到达的报文

tcp-006.jpg

  • TCP Flag
    • 8比特,即8个标识
    • CWR,ECE,URG(urgent),ACK,PSH(push,发送数据),RST(reset),SYN,FIN

tcp-007.jpg

三次握手

tcp-002.jpg

四次挥手

tcp-003.jpg

客户端状态序列

tcp-004.jpg

服务端状态序列

tcp-005.jpg

状态转换

case CLOSED:
    if(收到“被动打开”报文)
        进入LISTEN状态
    if(收到“主动打开”报文)
        发送SYN报文段
        进入SYN-SENT状态
    if(收到任何报文段)
        发送RST报文段
    if(收到任何其他报文)
        发出差错报文
    break
case LISTEN:
    if(收到“发送数据”报文)
        发送SYN报文段
        进入SYN-SENT状态
    if(收到任何SYN报文段)
        发送SYN+ACK报文
        进入SYN-RCVD状态
    if(收到任何其他报文段或者报文)
        发出差错报文
    break
case SYN-SENT状态:
    if(超时)
        进入CLOSED状态
    if(收到SYN报文段)
        发送SYN+ACK报文段
        进入SYN-RCVD状态
    if(收到SYN+ACK报文段)
        发送ACK报文段
        进入ESTABLISHED状态
    if(收到其他任何报文段或者报文)
         发出差错报文
    break
case SYN-RCVD状态:
    if(收到ACK报文段)
        进入ESTABLISHED状态
    if(超时)
        发送RST报文段
        进入CLOSED状态
    if(收到“关闭”报文)
        发送FIN报文段
        进入FIN-WAIT-1状态
    if(收到RST报文段)
        进入LISTEN状态
    if(收到任何其他报文段或者报文)
        发出差错报文
    break
case ESTABLISHED状态:
    if(收到FIN报文段)
        发送ACK报文段
        进入CLOSE-WAIT状态
    if(收到“关闭”报文)
        发送FIN报文段
        进入FIN-WAIT-1状态
    if(收到RST或SYN报文段)
        发出差错报文
    if(收到数据或ACK报文段)
        调用输入模块
    if(收到“发送”报文)
        调用输出模块
    break
case FIN-WAIT-1状态:
    if(收到FIN报文)
        发送ACK报文段
        进入CLOSING状态
    if(收到FIN+ACK报文段)
        发送ACK报文段
        进入TIME-WAIT状态
    if(收到ACK报文段)
        进入FIN-WAIT-2状态
    if(收到任何其他报文段或者报文)
        发出差错报文
    break
case FIN-WAIT-2状态:
    if(收到FIN报文段)
        发送ACK报文段
        进入TIME-WAIT状态
    break
case CLOSING状态:
    if(收到ACK报文段)
        进入TIME-WAIT状态
    if(收到其他任何报文段或者报文)
        发出差错报文
    break
case TIME-WAIT状态:
    if(超时)
        进入CLOSED状态
    if(收到FIN报文段)//自己补充的,我认为应该有这样一个
        发送ACK报文段
    if(收到其他任何报文段或者报文)
        发出差错报文
    break
case CLOSE-WAIT状态:
    if(收到“关闭”报文)
        发送FIN报文段
        进入LAST-ACK状态
    if(收到任何其他报文段或者报文)
        发出差错报文
    break
case LAST-ACK状态:
    if(收到ACK报文段)
        进入CLOSED状态
    if(收到任何其他报文段或者报文)
        发出差错报文
    break
  • 说明
    • 客户端TIME_WAIT时,如果最后一次发送的ACK丢失了(怎么判定丢失呢,根据服务端补发的FIN来判定),它将重新发送ACK
    • TIME_WAIT所等待时间依赖于具体实现方法
    • 典型值为30秒,1分钟和2分钟
    • 等待之后连接正式关闭,所有资源(包括端口号)被释放
    • TIME_WAIT一般是2MSL(Maximum Segment Lifetime)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eddy咸鱼

感谢大佬加鸡蛋~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值