概述

在《网络基础总结(一)》总结了TCP建立连接和断开连接的流程,然而TCP协议远比我所了解的复杂得多,我所知的可以说就冰山一角,所总结的也只是纸上谈兵,仅仅只能对TCP有个肤浅的认识,关于TCP协议细节可以推荐读下《TCP/IP 详解 卷1: 协议》,这篇随笔就看下TCP的报文吧。

TCP报文

TCP报文解析-LMLPHP

我们如何区分一台电脑上的不同应用进程?就像我们区分人一样,不同的人给标识不同的名字,偶尔还会遇到重名的,在计算机上重名的现象就禁止发生的,不同的应用进程,区分它们的是不同的端口号,有人占了这个端口运行,就不允许别人使用这个端口,所以不管是UDP协议还是TCP协议中端口号都尤为重要,源端口和目的端口都必不可少的,没有他们计算机不知道把数据发给哪个应用进程。

源端口:源头,发送方计算机上的端口号。

目的端口:接收一方计算机的端口号。

序号:序号,顾名思义,序号就是编号,给每个传输的字节编个号。老大,老二,老三,这样TCP就知道了,哪个应该先来,哪个应该后到,就解决了乱序的问题,在写的第一篇随笔中,用抓包工具给大家展示的三次握手,如果大家有注意可以看到sequence Number总是为0,其实不是这样的,seq的增加是和传输的字节数相关的,抓包工具为了显示更友好,使用相对序号。

确认号:这个就更好理解了,我给你写封信(发包),发出去总要有回信吧,确认一下信收到没,如果没回,我就认为信可能某种原因,丢了(包)。那我就继续发,直到你收到为止。这就解决丢包的问题,所以我们认为TCP是靠谱协议,但对于TCP来说,他面临的网络环境是很复杂的,如果网络状况确实很差,是没有任何有效的保证的,TCP也无能为力,唯一能做的,就是努力的重传。

数据偏移:数据偏移还有个名称也叫首部长度,因为TCP首部是长度可变的,这个报文段到底多长,也就是说指出TCP数据部分在整个TCP报文段的什么位置。

接下来就是一些状态位了,在第一篇随笔中有提过,SYN发起联机,ACK回复,RST重新联机,FIN结束联机等,前文提过TCP协议是双工的,双方要维护连接的状态,这些带状态位包的发送,会引起双方状态的变化。就像现实中,人与人之间,双方不断发出不同信号,两边的关系也会不断变化,个人认为是一个道理的。

窗口:说得专业点,告知发送端这个接收端缓存有多少,控制发送端发送数据的速率,达到流量控制。其实就是通信双方都声明一个窗口,标识出自己能够处理的能力,别丫的发送太快,把接收端撑爆,也别发得太慢,浪费了处理能力。

检验和:这个就有点像我们常见的验证码了,主要是对整个TCP报文段来说,TCP首部和数据在发送端和接收端之间发生任何的改动,接收方检验有差错,这个TCP段就会被直接丢弃。

紧急指针:紧急指针,就要想起我们的标志位UGR,它要配合URG一起使用,意思就是这个紧急指针只有在URG被置位才有用。紧急,紧急,八百里加急,它的作用很明显,TCP知道你要发送紧急数据,TCP会将接下来数据发送中,所有TCP报文段URG标志置位,哪怕你报文段没有紧急数据,这个动作要持续到紧急数据被发送为止。要注意的是紧急数据并不会开辟一条新的连接通道单独发送,依然是随着普通数据一起发送。

选项部分:最长报文大小,接收方或发送方所能接受的最大报文段的长度。通常连接方都在通信的第一个报文段中指明这个选项。

填充:见名知义,选项部分如果不是32位的整数倍,要添加填充位,加入额外的零,保证TCP头是32的整数倍。

数据部分 TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

参考:https://www.cnblogs.com/feng9exe/p/8058891.html

 ======================================================

如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!!

04-21 18:07