传输控制协议TCP

1、TCP概述

TCP(Transfer Control Protocol)传输控制协议,是TCP/IP体系中非常复杂的一个协议。其主要特点如下

1、TCP是面向连接的传输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。TCP通信类似打电话:通话前序拨号连接,通话后序挂机结束连接。
2、TCP连接只能有两个端点,每一条TCP连接只能点对点。
3、TCP提供可靠交付的服务。通过TCP连接传输数据,无差错、不丢失、不重复,并且按序到达。
4、TCP提供全双工通信。连接的两端都设有发送缓存和接收缓存,进程在任何时候都能收发数据。
5、面向字节流。TCP中的流(stream)指的是流入到进程或从进程流出的字节序列。

  TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。

2、TCP首部格式

  TCP虽然是面向字节流的,但TCP传输的数据单元是报文段。一个TCP报文段分为首部和数据部分,与UDP一致。而TCP的全部功能体现在它首部中各字段的作用。
  TCP报文首部前20个字节是固定的,后面有4n(n为整数)字节根据首部需要而增加的选项。TCP首部最小长度为20字节。
在这里插入图片描述
与wireshark抓包对照
在这里插入图片描述

2.1、各字段说明

  1、源端口号目的端口号 各占2个字节,与UDP端口用法相似。

  2、序号占4个字节。序号范围是0~2^32 -1, 表示此次发送的数据在整个报文段中的起始字节数。为了安全起见,它的初始值是一个随机生成的数,它到达最大值后,又从零开始。在TCP连接中传送的字节流中每一个字节都是按顺序编号。例如:

一段报文的序号是301,携带的数据共有100字节。表明:本段数据第一个字节的序号是301,最后一个字节的序号是400。如果此时还有下一段报文,数据的序号应当从401开始,即下一段的序号字段值应该为401。

  3、确认号占4个字节,指定的是期望收到下一个报文段的第一个字节的序号,接着上个例子:

B正确收到A发来的报文段,其序号字段值是301,数据长度是100字节。表明B正确收到了A发送的到序号400为止的数据。因此B期望收到A的下一个数据序号是401,于是B在发送给A的确认报文段中把确认号置位401。

  4、数据偏移占4,指出TCP报文段的首部长度。因为首部中有长度可变选项,因此此字段是必要的。应注意此字段的单位是32位(4字节),4位二进制数能表达的最大十进制数是15,因此可表达的最大长度值为15*4=60字节。即后面的选项字段长度不能超过40字节。
  5、保留占6位,保留为后续开发功能使用。当前置为0。
  6、紧急URG,占1位,置为1时表明该字段有效。标明报文有紧急数据,传输优先级高。
  7、确认ACK,占1位,当ACK=1时确认字段有效。当为0时,确认无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
  8、推送PSH(PuSH),占1位,当两个进程在通信时,一端的进程希望在键入一个命令后立即能够收到对方响应。这种情况下,TCP就可以使用推送操作。发送方把PSH置1,并发送出去,接收方收到PSH = 1的报文就会尽快地交付相应资源。平时很少使用。
  9、复位RST,占1位,当RST置1时,表明TCP连接中出现严重差错,必须释放连接,然后重新建立连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。
  10、同步SYN,占1位,在连接建立时用来同步序号。当SYN=1而ACK=0,表名这是一个连接请求报文。若同意建立连接,响应报文中使SYN=1和ACK=1。后面三次握手会重点说。
  11、终止FIN,占1位,用来释放一个连接。当FIN=1时,表明此报文的发送方的数据已发完毕,并要求释放连接。后面四次挥手也会用到。
  12、窗口占2个字节。窗口值是0 ~ 2^16 -1之间的整数。窗口指的是自己的 接收窗口。窗口值告诉对方自己能接收的数据量(字节为单位)。之所以有这个限制,是因为接收方的数据缓存空间时有限的。根据进程的处理速度,窗口值经常在动态的变化。
  13、检验和,占2字节。检验和字段检验的范围包括首部数据两部分。和UDP一致,要在TCP报文的前面加上12字节的伪首部。与之前的UDP那篇一样,只不过将协议号,和长度字段变换。
  14、紧急指针,占2字节。紧急指针仅在URG=1有意义。它指出本报文段中紧急数据的长度即字节数。注意:即使窗口为零时也可以发送紧急数据。
  15、选项填充,长度可变,最长40字节。当没有使用此字段时,TCP的首部长度是20字节。

3、TCP的连接建立

  TCP建立连接的过程叫做握手,握手是需要在客户和服务器之间交换三个TCP报文段。
在这里插入图片描述
注意:

其中大写ACK(Acknowledgment)是确认字段,小写ack(Acknowledgment number )是确认号字段,seq是序号字段

  假定主机A运行的是TCP客户程序,B运行的是TCP服务器程序。最初两端的TCP进程都处于CLOSED(关闭)状态。上图,主机下面的方框分别是TCP进程所处的状态。本例中,A主动打开连接,B被动打开连接。
  一开始,B的TCP服务进程会一直处于LISTEN(监听)状态,等待客户的连接请求。
  1A的TCP客户进程打算与B建立TCP连接时,向B发出连接请求报文,结合上面总结过的FLAGS字段各个标志位,这时报文TCP首部中同步位SYN=1,同时序号字段随机初始化一个数值seq=x。TCP规定,SYN=1的报文不能携带数据,但要消耗一个序号(即A的下个报文序号需+1)。这时TCP客户进程进入SYN-SENT(同步已发送)状态。

  2B收到连接请求报文后,如果统一建立连接,这向A发送确认。在回应的TCP报文中把SYNACK字段都置1,确认号ack=x+1,同时也为自己随机初始化一个序号seq=y。此段报文也不能携带数据,但同样需要消耗一个序号(即B的下个报文序号需+1)。这时TCP服务进程进入SYN-RCVD(同步收到)状态。

  3、A的TCP客户进程收到B的确认响应后,还需向B给出确认。报文段中TCP首部ACK字段置1,确认号ack=y+1,自己的序号seq=x+1。ACK=1的报文段可以携带数据。如果不携带数据则不消耗序号(即A的下一个TCP报文序号字段仍是seq=x+1)。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
  B收到A的确认后也进入ESTABLISHED状态。
在这里插入图片描述
1、SYN=1;seq=0;
在这里插入图片描述
2、SYN=1;ACK=1;seq=0;ack=1;
在这里插入图片描述
3、ACK=1;seq=1;ack=1;
在这里插入图片描述

上图为抓包TCP握手报文

3、TCP的连接释放

  TCP连接释放过程比较复杂,数据传输结束后,通信的双方都可以主动释放连接。这个过程有4个阶段通常也称为4次挥手。
在这里插入图片描述
  如上图,A,B双方都处于ESTABLISHED,假设A的应用进程先主动关闭TCP连接。
  1、A应用进程发出释放连接报文段,TCP报文首部终止控制位FIN置1,其序号seq=u,u等于前面已传送的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。注意:FIN报文段即使不携带数据,也要消耗一个序号,与SYN,ACK报文一致。
  2、B收到连接释放报文后即发出确认并响应,首部中,seq=v,确认号ack=u+1。然后B进入CLOSE-WAIT(关闭等待)。因为A到B这个方向连接已释放,这时TCP连接处于半关闭(half-close)状态,即A到B已经没有数据要发送了,但若B发送数据到A,A仍然要接收,B到A的连接并未关闭,这个状态持续时间根据B的情况而定。
  A收到来自B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出释放连接报文。
  3、当B已经没有要向A发送的数据时,B发出连接释放报文段,TCP首部中FIN=1。其中假定序号seq=w,确认序号认为ack=u+1。此时B进入LAST-ACK(最后确认)状态,等待A的确认。
  4、A收到B的连接释放报文段后,必须对此发出确认。在确认报文中把ACK置1,确认序号ack=w+1,自己的序号seq=u+1。然后进入TIME-WAIT(时间等待)状态。注意:此时TCP连接还没释放掉。必须经过时间等待计时器设定时间2MSL后(设定的时间为多长不同场景不定,大家可自行查询),A才能进入到CLOSED状态。B收到A发出的确认,进入CLOSED状态。
在这里插入图片描述
1、FIN=1;seq=483;
在这里插入图片描述

2、ACK=1;seq=1268;ack=484;
在这里插入图片描述

3、ACK=1;FIN=1;seq=1268;ack=484;
在这里插入图片描述

4、ACK=1;seq=484;ack=1269;
在这里插入图片描述

设置时间等待的原因:

1、为了保证A发送的ACK报文段能够到达B。
2、防止“已失效连接请求报文段”。

查询时间计时器相关方法:cat /proc/sys/net/ipv4/tcp_fin_timeout
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为你解答这些问题。 1. 运输层协议概述: 运输层位于网络层和应用层之间,主要功能是为应用层提供数据传输服务。运输层的协议有两种:UDP和TCP。UDP是无连接的、不可靠的数据传输协议,它只提供基本的数据传输服务;TCP是面向连接的、可靠的数据传输协议,它提供了完整的数据传输服务。 2. 用户数据报协议 UDP: UDP是一种无连接的、不可靠的数据传输协议。它不需要建立连接,只需要将数据发送到目的地即可。UDP没有拥塞控制和流量控制的功能,因此传输效率高,但数据传输的可靠性较差。UDP主要用于实时应用,如音视频传输、实时游戏等。 3. 传输控制协议 TCP 概述: TCP是一种面向连接的、可靠的数据传输协议。在传输数据之前,需要先建立连接,然后进行数据传输,最后释放连接。TCP提供了拥塞控制、流量控制、可靠传输等功能,保证了数据传输的可靠性。TCP主要用于需要可靠传输的应用,如文件传输、电子邮件等。 4. TCP的运输连接管理: TCP的连接管理主要包括三个阶段:连接建立、数据传输和连接释放。连接建立时,需要进行三次握手,确保双方都能够正常通信。数据传输时,通过序号和确认号来保证数据的可靠传输。连接释放时,需要进行四次挥手,确保双方都能够正常结束连接。 收获:通过学习运输层协议的概述,我了解到运输层的作用和协议种类;通过学习UDP和TCP的概述,我了解了它们的特点和应用场景;通过学习TCP的运输连接管理,我了解了TCP的连接建立、数据传输和连接释放的过程。这些知识对我今后的网络编程和应用开发有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值