TCP协议简要说明

博文内容提炼自《网络是怎样连接的》一书,个人认为这本书非常适合想要了解网络整体框架的同学,强烈推荐想要学习网络知识的小伙伴。

要理解TCP协议,那么理解头部信息的内容非常重要,理解了头部各字段的意义,就等于理解了通讯的整个过程。

重点理解四个字段:序号,ACK号,控制位,窗口

序号:发送方告知接收方该网络包所发送的数据相当于所有发送数据的第几个字节。

控制位:控制位一个重要用法,就是connect过程中的三次握手操作和四次挥手,TCP中经典的三次握手操作是通过控制位的BIT[SYNC]和BIT[ACK]来实现的。
SYN 设为 1 并告知初始序号这一操作仅在连接过程中出现,因此发送SYN 为 1 的网络包就表示发起连接的意思。

三次握手

三次握手完成后,即connect函数调用完成后,接下来就要进行数据收发操作。
应用程序调用write发送数据时,实际是先存放在发送缓冲区的,并不是立马发出,判断数据什么时候发送出去,主要由两个要素决定:
1、每个网络包所能容纳的数据长度,即MTU(以太网为1500),当应用程序收到的数据超过或接近MSS时,则发送,这样可以避免大量小包。
2、即使缓冲区的数据长度没有达到MSS,也应该果断发送出去,为此,协议栈内部实现了一个计时器,当满足一定时间后,则发送,这样可以
   避免发送延时。
3、应用程序在发送数据时,可以指定一个选项,比如指定“不等待填满缓冲区直接发送”,这样发送时刻交给用户控制。

单窗口时客户端与服务器发送接收报文流程,假设在连接阶段,确定的序号初始值为1,窗口大小也为1。

单窗口客户端与服务器报文交互流程

ACK回传等待时间不能太长也不能太短:
1、太短:当网络拥塞时,ACK的返回会变慢,如果ACK等待设计时间过短,会导致触发重传,导致网络里出现多余的报文,加剧网络拥塞。.
2、太长:如果报文丢失时,触发重传的实际被延后,导致网络速度变慢。
因此ACK等待时间设为为一个固定值是不合理的,因此,TCP采用了动态调整的方法来设置ACK等待时间。


在窗口为1的模式下,当客户端发送完一个报文后,其进入ACK等待期,在这一段时间内是不做操作的,这大大浪费了时间和资源。因此,TCP
一般采用滑动窗口的方式来管理数据发送和ACK号的回复操作。

所谓滑动窗口,就是在发送一个包之后,不等待ACK号返回,而是直接发送后续一系列的包,这样一来,等待ACK号的这段时间就被利用起来了。
但是这样引入了另外一个问题,当发送包的频率超过接收方处理能力的时候,接收端缓冲区会溢出,导致数据丢失。为了避免这样的情况,接收方
需要告知发送方自己最多还能接收多少数据,发送方通过这个数据控制自己对数据的发送,即接收方要实时更新窗口大小。

窗口更新时机

接收方不用没收到一个包就更新缓冲区,因为发送方在当前的窗口大小下,根据已经发送了多少个报文,是能够计算到当前窗口
的剩余长度的。当接收方的接收数据能力改变的时候,即接收方缓冲区的数据被应用程序取走的时候,接收方更新缓冲区。

四次挥手 

客户端或服务器完成数据发送后,会调用close接口发起断开连接。close内部采用即四次挥手实现,四次挥手使用控制位的BIT[FIN]和ACK号实现。

客户端和服务器通讯的完整过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值