网络编程——TCP协议概述(三次握手、四次分手)

1 篇文章 0 订阅

一、TCP协议简介

TCP协议是面向连接的协议,其主要特点有面向连接、可靠传输、面向字节流。

  1. 面向连接:通信之前需要经过三次握手建立可靠的连接,通信结束后需要经过四次分手断开连接,是一对一的通信协议,不支持广播和多播。
  2. 可靠传输:发送端每次发送的数据都需要得到接收端的ACK,并且,TCP还有超时重传、定时器等机制确保每一份报文都安全到达接收方。
  3. 面向字节流。读写操作是无边界的,即发送端执行的写操作次数和接收端执行的读操作次数之间无关。发送端执行写操作时,数据被放置到缓冲区,直到真正发送时,才将缓冲区的数据封装成多个TCP报文发送,然后接收方将TCP报文放置到缓冲区,需要时再从缓冲区一次或多次读出。

二、TCP头部结构

在这里插入图片描述
TCP的头部分为固定头部结构和头部选项,TCP的固定头部为20字节,头部选项不大于40字节,头部总长度最大为60字节。
4. 16位源端口号和16位目的端口号,分别表示报文段来自于哪个端口和传输到哪个端口(上层协议或应用程序)
5. 32位序号是一次TCP通信过程中某某一个方向字节流的每个字节的编号
6. 32位确认号另一方发送的TCP报文响应,值为收到的TCP报文段最大字节+1
7. 4位首部长度代表该TCP首部有多少4字节,最多有4*15=60字节
8. 标志位有:
(1)URG:紧急指针时有效(外带数据)
(2)ACK:确认报文段,确定确认号是否有效
(3)PSH:提示接收端应立即从缓存读走数据,为后续数据预留空间
(4)RST:复位报文段,要求对方重新建立连接
(5)SYN:同步报文段,请求建立一个连接
(6)FIN:结束报文段,通知对方要关闭连接
9. 16位窗口大小:TCP流量控制的手段,告诉本端TCP缓冲区还剩多少容量
10. 16位校验和:校验CRC冗余码,确保可靠传输
11. 16位紧急指针:当URG标志时有效,发送端向接收端发送紧急数据,指向亟需发送的数据
12. 选项是可变长度可选信息,最多包含40字节
在这里插入图片描述
kind说明选项类型,length指定选项总长度,info说明选项具体信息
在这里插入图片描述
(1)kind=0:选项表结束
(2)kind=1:空操作选项
(3)kind=2:最大报文段长度选项(MSS)。TCP连接初始化时,双方使用该选项协商最大报文段长度MSS,一般为MTU-40,即最大传输单元减去40字节(20字节的TCP头部和20字节的IP头部),避免本机发生IP分片(当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功)
(4)kind=3:窗口扩大因子选项,用于协商接收窗口的大小,和MSS一样只能出现在SYN同步报文段中
(5)kind=4:选择性确认选项(SACK),TCP报文丢失时,SACK只让TCP重传丢失的报文段,而不是所有未确认的报文段
(6)kind=5:SACK实际工作选项,该参数告诉发送端,接收端已经收到并缓存不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块
(7)kind=8:时间戳选项

三、TCP三次握手

在这里插入图片描述

三次握手流程如下:

  • 客户端向服务器发送一个SYN(同步序列编号,设为1)和J(seq,发送报文段中的第一个字节的数据编号),用于发起连接请求;
  • 服务器向客户端响应一个 SYN和K,同时对SYN和J进行确认
  • 客户端再向服务器发一个确认 ACK K+1

四、TCP四次分手

在这里插入图片描述

  • 客户端调用close()关闭连接,并向服务器发送一个FIN(请求关闭连接)和M(seq);
  • 服务器收到FIN M时,执行被动关闭,并对其进行确认;
  • 等文件传输结束后,服务器调用close关闭socket,并向客户端发送一个FIN N;
  • 客户端收到FIN N时,并向服务器发送确认。

四、TCP状态转移

在这里插入图片描述
TIME_WAIT状态:指的是客户端收到服务器的结束报文后进入的状态,需要等待2MSL才能关闭(MSL是maximum segment lifetime的简称,即为任何IP数据报能够在因特网中存活的最长时间)。目的是:

  • 为了让最后的ACK报文顺利到达服务器
  • 保证迟到的TCP报文有足够的时间被识别并丢弃
  • 设置2MSL的原因是确定2个方向的TCP报文都已经被丢弃,迟到的TCP报文消失

对客户端来说,一般不需要考虑TIME_WAIT状态,因为其一般使用临时端口建立连接;
对服务器来说,若主动断开连接后会存在TIME_WAIT状态

五、TCP状态转移

  1. 超时重传:TCP服务必须能重传超出时间未确认的TCP报文段,因此TCP协议为每一个TCP报文段都维护一个重传定时器,该定时器在TCP报文第一次被发送时启动,超时则重传并重置定时器
  2. 拥塞控制:包括慢启动、拥塞避免、快速重传、快速恢复4部分。拥塞控制最终控制的变量是发送端向网络一次连续写入的数据量,即发送窗口(SWND),其次取RWND(接收窗口)和CWND(拥塞窗口)中的较小值。
    在这里插入图片描述

拥塞发生的依据:
1)传输超时或者TCP定时器溢出(采用慢启动,拥塞避免)
2)接收到重复的确认报文段(采用快速重传和快速恢复)
(1)慢启动和拥塞避免:一开始以试探增加CWND,CWND按照指数形式扩大(慢启动,慢启动其实一点都不慢),当到达慢启动门限时,则使CWND按照线性方式增加,从而减缓其扩大(拥塞避免)。当发生传输超时,一般门限值会下降一半,然后CWND会变为SMSS。
(2) 快速重传和快速恢复:发送端如果收到3个重复地确认报文段,则确定拥塞发生。就可以启动快速重传与快速恢复。
3. 快速重传和快速恢复过程:
4. 收到第3个ACK之后,先计算慢启动门限值ssthresh,然后计算CWND。
ssthresh=max(FlightSize/2,2SMSS)
其中FlightSize是已经发送但未收到确认的字节数。
计算出新的ssthresh之后,然后重传丢失报文段。重新计算CWND。
CWND= ssthresh+3
SMSS
5. 没收到一个确认报文之后就执行CWND+=SMSS。
6. 当收到新数据的确认时,设置CWND= ssthresh。

六、参考文献

1. TCP协议详述
2. Linux网络总结之四-TCP超时重传与拥塞控制
3. 网络编程-Socket

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值