【计算机通信网络复习】TCP协议

1. TCP协议的报文格式

TCP报文也称为报文段(segment),分首部和数据两部分。首部的前20个字节是固定的,后面是选项,因此TCP首部最小长度是20字节。选项部分长度可变,最多为40字节。
TCP协议报文格式
(1)源/目的端口(16bits),端口号加上IP地址构成了一个套接字socket。
(2)序号(32bits),本报文段发送数据第一个字节序号,使用随机数产生器产生一个初始序号
(3)确认号(32bits),当ACK=1时有意义,当ACK=0时没有意义。期望收到对方下次发送数据第一个字节序号。(也就是期望收到的下一个报文段的首部中的序号)由于序号字段长度为32bit,可对4GB数据进行编号,以保证序号重复使用时,旧序号数据早已在网络中消失。
(4)数据偏移(4bits),它指出数据开始的地方离TCP报文段的起始处有多远,这是由于TCP报文中含有选项和填充字段。实际上就是TCP报文段首部的长度,其值所表示的距离单位是32比特(以4字节为一个单元来计算的)。
(5)保留(6bits),供今后使用,目前置为0。
(6)控制比特(6bits)
紧急位URG:URG=1时,报文应尽快传送(相当于加速数据),不按原来顺序来传送。要与紧急指针(Urgent Pointer)字段配合使用。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。紧急指针使接收方可以知道紧急数据有多长。
在这里插入图片描述
确认位ACK:ACK=1时有意义,代表这个数据包是响应数据包,与接收序号(确认序号)配合使用。
推送位PSH(PuSH):PSH=1时,当两个进程进行交互式通信时,一端应用进程希望在输入一个命令之后能够立即得到对方的响应,立即创建一个报文段发送到对方。
在这里插入图片描述
复位RST(ReSeT):RST=1时,表明出现严重差错,必须释放连接,然后再重建连接。还可以用来拒绝一个非法报文段或拒绝打开一个连接。
同步位SYN:在建立连接时使用;SYN=1且ACK=0时,表明这是连接请求报文段。对方若同意建立连接,则应在发回的报文段中SYN=1且ACK=1。因此,SYN=1,就表示这是一个连接请求或连接接受报文,而ACK位的值用来区分是哪一种报文(请求/接受)
终止位FIN(FINal):FIN=1,表明发送字节已经发完,要求释放传输连接。
(7)窗口(16bits),用来控制对方发送的数据量。用接收方的接收能力来控制发送方的数据发送量,数值是动态变化的。
(8)校验和(32bits),包括首部和数据这两部分,要在TCP报文段的前面加上一个12字节伪首部。
TCP在校验前,需要根据IP数据包增加伪首部。伪首部增加了TCP校验和的检错能力:检查TCP报文是否收错了(目的IP地址)、传输层协议是否正确(传输层协议号)等。
在这里插入图片描述

(9)紧急指针(16bits),同时与URG位并用,指明紧急数据之后正常数据的起始位置。
(10)选项(0-40bits),单字节选项有两个:选项结束和无操作。多字节选项有三个:最大报文段长度、窗口扩大因子以及时间戳。

2. TCP连接的建立与释放

2.1. TCP连接建立

(1)需要经过**“三次握手”**(Three-Way Handshake)。这是为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。
(2)TCP 连接建立的“三次握手”:
**最初,**客户端处于CLOSE(关闭)状态,服务器处于LISTEN(收听)状态。
第一次握手:客户端发送SYN包(seq=x, ack=y)到服务器,并进入SYN_SENT状态,等待服务器确认。
第二次握手:服务器收到客户端的SYN包必须确认,同时服务器也要发送SYN+ACK包(seq=y, ack=x+1);服务器进入SYN_RECV状态。
第三次握手:服务器收到客户端的SYN包必须确认,同时服务器也要发送SYN+ACK包(seq=y, ack=x+1);服务器进入SYN_RECV状态。
TCP连接的“三次握手”

2.2. TCP连接释放

(1)需要经过**“四次挥手”**(Four-Way Wavehand)。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
(2)TCP 连接释放的“四次挥手”:
此时,客户端和服务器均处于ESTABLISHED状态。
第一次挥手:客户端向服务器发送FIN包(seq=u, ack=v),进入FIN_WAIT_1状态;u=客户端上次发送最后一个字节序号加1。
第二次挥手:服务器收到FIN包后不回复FIN包,而回复ACK包(seq=v, ack=u+1),v=服务器上次发送最后一个字节序号加1;服务器通知应用程序客户端要求关闭连接,服务器进入CLOSE_WAIT状态,即半关闭状态,此时客户端虽没有数据要发送,但服务器可能有数据要发送;客户端进入CLOSE_WAIT_2状态,且要等待一段时间。
第三次挥手:服务器将最后的数据发送完毕后,向客户端发送FIN包(seq=w, ack=u+1),由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w;服务器进入LAST_ACK状态,等待客户端确认。
第四次挥手:客户端收到FIN包后,向服务器发送ACK包(seq=u+1, ack=w+1),表示连接彻底释放。
在这里插入图片描述

3. TCP协议流量控制、拥塞控制

(1)TCP不是按传送的报文段编号。TCP将所要传送的整个报文(可能包括多个报文段)看成是由一个个字节组成的数据流,然后对每一个字节编号。在连接建立时,双方商定初始序号。TCP将每一次传送的报文段中的第一个数据字节的序号放在TCP首部的序号字段中。TCP的确认是对接收到的数据的最高序号(即收到的数据流中的最后一个序号)表示确认。但返回的确认序号是已收到的数据的最高序号加1。也就是确认序号即表示期望下次收到的第一个数据字节的序号。
(2)TCP采用滑动窗口方式进行流量控制。窗口大小以字节为单位。TCP报文段首部窗口字段的数值是当前设定的接收窗口数值。发送窗口在连接建立时由双方商定,但在通信的过程中,接收方可根据自己的资源情况,随时动态地调整接收窗口的大小,然后告诉发送方,使发送方的窗口和自己的接收窗口一致。
在这里插入图片描述
(3)拥塞控制用于防止由于过多的报文进入网络,而造成路由器与链路过载。
拥塞窗口:源端一次最多能发送的数据包数量。
门限窗口:拥塞窗口按指数增长还是线性增长的界限。
拥塞控制技术
慢开始:每出现一次拥塞超时,拥塞窗口都降低到1。
拥塞避免:当拥塞窗口增大到门限窗口值时,就将拥塞窗口指数增长速度降低为线性增长,避免网络再次出现拥塞。
加速递减:每出现一次拥塞超时,就将门限窗口值减半。
在这里插入图片描述
TCP每发送一个报文段,就设置一次定时器。只要定时器设置的重发时间已到而没有收到确认,就要重发这一报文段。计算往返时延的自适应算法(加权法):
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值