面试必问的TCP,你真的回答对了吗?

50 篇文章 0 订阅
44 篇文章 0 订阅

大家好,我是洪爵鸭,接下来几篇文章都是想和大家聊一下TCP。

为什么要聊TCP?因为洪爵发现几乎所有面试计网的题目都围绕着TCP,或者从TCP延伸问出,比如说三次握手,两次握手可以吗?四次挥手,为什么要有个TIME WAIT?流量控制,拥塞控制,滑动窗口等等。所以,想花几篇文章的时间,带大家梳理一遍TCP的基础知识

TCP的全部功能都体现在它首部中的各个字段,因此只有弄清TCP首部各个字段的作用才能掌握TCP的工作原理,所以洪爵想先从TCP的首部开始讲解,大家要注意哦,开始发车了!
在这里插入图片描述

TCP首部各字段意义

(1)源端口和目的端口,看过洪爵UDP文章的就知道,这是用来表示通信双方进程的端口号,各占2个字节

(2)序号,占4个字节,序号的范围可以计算出[0, 2^32 - 1],当需要用到2^32-1后,它的下一个序号会开始重新从小到大生成,也就是说,最终的序号 = 序号 % 2^32。TCP是面向字节流的,第一个序号是在建立TCP连接的时候生成的,并不一定是从0开始,它是一个随机值,具体为什么要这样,后续随着深入我们会讨论到,本次只做了解。TCP传输的字节流中的每一个字节都会给到一个序号,首部中的序号字段指的是本报文段所发送数据的第一个字节的序号。我们举个例子,比如说某报文段A的序号字段值为201,这个报文段A携带有100字节的数据,这就表明:这个报文段A的第一个字节的序号为201,最后一个字节的需要300,所以如果它还有下一个报文段B,那么这个报文段B的序号就为301。

(3)确认号,同样是占用4个字节,它是表示期望收到对方下一个报文段的第一个数据字节的序号。就比如上面举到的那个例子,报文段A发送数据到接收端,序号为201,数据长度有100字节,那么久表明接收端已经收到了序号201~300的数据。那么接收端期望发送端下一个报文段的序号为301,所以接收端会把确认报文段中的确认号置为301。总的来说:若确认号为k,那么就表示到序号k - 1为止的所有数据都已正确收到。

(4)数据偏移,占用4位,它是用来干什么的呢?它的作用是指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。很多人就会想,这不就是指的TCP报文段的首部长度吗?但是因为首部字段中还有长度不确定选项字段,所以数据偏移字段是必要的,并且数据偏移的单位是32位字(4个字节),换算一下,4位能表示十进制0-15,所以数据偏移能表示的最大值为15*4 = 60个字节,这也是TCP首部的最大长度,即选项长度不能超过40个字节

(5)保留,这个字段占6位,保留为今后使用,目前是置为0。

(6)接下来是6个控制位,用来表示当前报文段的性质。

紧急URG,当URG = 1时,表明紧急指针字段有效。它的一个主要功能是表明当前这个报文段有紧急的数据,需要尽快的传送(高优先级数据),而不需要去排队等待传送,它会把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据,这个需要与首部中的紧急指针相互配合使用

确认ACK,当ACK = 1的时候确认号字段才有效,当ACK = 0表示确认号无效。TCP规定在连接建立后所有传送的报文段都必须把ACK置为1

推送PSH,当两个应用进程在进行交互式通信时,希望某一端在输出一个命令后,对方能立即响应。这个时候,TCP就可以使用push操作,发送方把PSH置为1,接收方收到PSH = 1的报文段,会尽快的交付响应,不需要等待整个缓存填满了才交付。

复位RST,当RST = 1时,表明TCP连接中出现了严重差错,必须要释放连接,然后在重新建立运输连接。RST置为1还有另外一个功能,就是拒绝一个非法的报文段或拒绝打开一个连接。

同步SYN,当SYN = 1而ACK = 0表示这是一个建立连接请求的报文段。若对方同意建立连接,那么响应报文段的SYN = 1和ACK = 1。因此SYN置为1就表示这是一个连接请求或者连接接受报文。

终止FIN,用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

(7)窗口,占2个字节,所以窗口值是[0, 16^2 - 1]之间的整数。窗口指的是发送本报文段一方(发送端)的接收窗口(不是发送窗口!!!),这个字段旨在告诉对方,从本报文段首部的确认号开始算起,目前允许对方发送的数据量(单位:字节)。因为每一方的数据缓存空间是有限的,窗口值作为接收方让发送方设置其发送窗口的依据,所以窗口值会经常在动态的变化

(8)检验和,占2个字节,检验和字段包括首部数据两个部分,和UDP中的检验和几乎一样,大家可以看下第二篇文章【【】【】【】】,TCP要生成一个12字节的伪首部,但是不同的是,伪首部的第4个字段需要从17改成6(UDP协议号是17,TCP协议号是6),第5个字段中的UDP长度改为TCP长度。

(9)紧急指针,占2个字节紧急指针仅在URG = 1时才有意义,它指出本报文段紧急数据的字节数(紧急数据结束后就是普通的数据)。紧急指针的作用是指出紧急数据的末尾在报文段的位置。(窗口为0也可以发送紧急数据)

(10)选项,长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度为20字节。那么选项包含哪些数据呢?TCP最初的时候只规定了一中选项:MSS(Maximum Segment Size)最长报文段长度。要注意的是,这个指的是每一个TCP报文段中的数据字段的最大长度,数据字段加上TCP首部才等于整个TCP报文段。若MSS过小,网络利用率降低MSS过大就需要在IP层分片,所以MSS尽量设置成在IP层不分片就ok。具体在UDP文章都有详细叙述,这里不再重复讲解。后面随着互联网的发展,又增加了些新选项,如窗口扩大时间戳SACK选项等。

(11)填充,填充仅仅是为了使整个TCP首部长度是4字节的整数倍。如果刚好是4字节的整数倍,那么就不需要填充。

好的,我们讲完了TCP中的各字段意义,希望看完这篇文章的小伙伴可以对TCP有一个更深入的了解!ok,我们准备开始TCP的遨游之旅啦!期待洪爵下一篇文章吧!

愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KnightHONG

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值