tcp/ip

tcp/ip

TCP(Transmission Control Protocol) 即传输控制协议,是一种面向连接的(需通过三次握手来建立 TCP 连接,在主机间建立会话)、可靠的(TCP 通过确认和按顺序传递来确保数据的传递)、基于字节流的传输层通信协议,但 TCP 传输比较慢,开销略高,并且只支持点对点通信。为应用层提供全双工服务。

TCP数据帧格式

image-20220413193445653

源端口:2 个字节,是一个大于 1023 的 16 位数字,由基于 TCP 应用程序的用户进程随机选择。

目的端口:2 个字节,指明接收者所用的端口号,一般由应用程序来指定。

顺序号:4 个字节,用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用顺序号对每个字节进行计数,序号是 32 bit 的无符号数,序号达到 2^32-1 后又从 0 开始。比如我们收到一个数据报中 sq(顺序号) =0,数据报内容为 20 字节,那么下一个数据报的 sq 就应该是 21。当建立一个新的连接时,SYN 标志变为 1,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN。

确认序号:4 个字节,包含发送确认的一端所期待收到的下一个顺序号。因此,确认序号应该是上次已经成功收到数据字节顺序号加 1 。比如我们收到的一个数据报的 sq = 0 ,数据报内容为 20 字节,那么我们的 ack(确认序号) 应该是 21 ,用来表明 sq=0 ,内容为 20 字节的数据报已经收到,接下来期望收到的是 sq=21 的数据报。只有 ACK 标志为 1 时确认序号字段才有效。

报文长度:4 位,给出报头中 32 bit 字的数目,需要这个值是因为任选字段的长度是可变的,这个字段占 4 bit,即 TCP 最多有 60 (15*4) 字节的首部。

保留区:6 位,保留给将来使用,目前必须置为 0 。

控制位:6位,控制位包括

URG:为 1 表示紧急指针有效,为 0 则忽略紧急指针值。

ACK:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段。

PSH:为 1 表示是带有 PUSH 标志的数据,表示发送端缓存中已经没有待发送的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。

RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题。

SYN:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步。

FIN:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流。

窗口大小:2 个字节,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口的大小。窗口大小是一个 16 bit 字段,因而窗口大小最大为 2^16-1 。

校验和:2 个字节,对整个的 TCP 报文段(包括 TCP 头部和 TCP 数据以及伪报文头)进行校验和计算。这是一个强制性的字段,要求由发送方计算和存储,并由接收端进行验证(接收端要与发送端数值结果完全一样,才能证明数据是有效的)。

紧急指针:2 个字节,是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式,只有当 URG 标志置为 1 时紧急指针才有效。

选项:n*4 字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段 (为建立连接而设置 SYN 标志的那个段) 中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以需要添加填充位,使得报文长度为 32 位字的整数倍。

数据:不定长度,为上层协议封装好的数据。

tcp滑动窗口

img

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。

TCP三次握手

这里写图片描述

第一次握手
客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。

SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

第二次握手
服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。

ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包

第三次握手
客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。

IP数据帧格式

image-20220413193941279

首部长度:即报头长度,4 位,以 32 bit 的字来定义 IP 首部的长度,包括可选项。若该字段的最小值是 5 (标准头部长度),即 532=160 比特 =20 字节,此字段最大值为15 (有扩展部分),即1532 =480 比特 = 60 字节。

服务类型:8位,用于携带提供服务质量特征信息的字段,服务类型字段声明了数据报被网络系统传输时可以被怎样处理。其中前 3 比特位优先权子字段(Precedence,现已被忽略,各种终端都不采用)。第 8 比特保留未用。第 4 至第 7 比特分别代表延迟、吞吐量、可靠性和花费,当它们取值为 1 时分别代表要求最小时延、最大吞吐量、最高可靠性和最小花费,这 4 比特的服务类型中只能置其中 1 比特为 1,可以全为 0 ,若全为 0 则表示一般服务,大多数情况下该服务类型会被忽略。

总长度:16 位,指明整个数据报的长度,按字节计算,最大长度为 2^16 字节。

标识:16 位,用来唯一标识主机发送的每一份数据报,IP 软件会在存储器中维持一个计数器,每产生一个数据段,计数器就加 1,并将此值赋给标志字段。但这个“标识”并不是序号,因为 IP 是无连接服务,数据报不存在按序接收问题,如数据报由于超过网络的 MTU (最大传送单元) 而必须分片时,这个标志字段的值就会被复制到所有的数据报的标识字段中,相同的标识字段的值使分片后各数据报片能正确的重装成为原来的数据报。

标志:3 位,分别是 RF、DF、 MF,目前只有 DF,MF 有效,DF(don't fragment),置为 0 时表示可以分段,置为 1 时是不能被分段,MF(more fragment),置为 0 时表示该数据段为最后一个数据段,置为 1 时表示后面还有被分割分段。

段偏移量:13 位,指出较长的分组在分段后,某段在原分组的相对位置。也就是说相对用户字段的起点,该片从何处开始。段偏移以 8 个字节(有 3 位被 flags 占据)为偏移单位,这就是每个分片的长度一定是 8 字节 (64位) 的整数倍。

生存期:8 位,用来设置数据报最多可以经过的路由器数,由发送数据的源主机设置,通常为 32、64、128等,每经过一个路由器,其值减 1 ,直到 0 该数据报被丢弃。

协议:8 位,指明 ip 数据字段中的数据采用上层什么协议封装的,常见的有 ICMP(1)、IGMP(2)、TCP(6)、UDP(17)

首部校验和:16位,填充根据 ip 头部计算得到的校验和码。计算方法是:对头部中每个 16 比特进行二进制反码求和,但不含涉及头部后的数据字段。

源 IP 地址:源 ip 地址,32 位。

目的 IP 地址:目标 ip 地址,32 位。

选项:n*32 位,用来定义一些可选项:如记录路径、时间戳等,但这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选字段的长度必须是 32 比特的整数倍,如果不足,必须填充 0 以达到此长度要求,根据 IHL(首部长度) 可以得到选项的长度。

数据:不定长度,但受限于数据报的最大长度 2^16 ,这是在数据报中要传输的数据,它是一个完整的较高层报文或报文的一个分片。

以太网帧格式:

img

前导码:7 个字节,用于数据传输过程中的双方发送与接收的速率的同步。

SFD:帧开始符,1 个字节,用于标识一个以太网帧的开始。

目的 MAC 地址:6 个字节,指明帧的接收者。

源 MAC 地址:6 个字节,指明帧的发送者。

长度:2 个字节,指明该帧数据字段的长度,但不代表数据字段长度能够达到 2^16 字节。

类型:2 个字节,指明帧中数据的协议类型,比如常见的 IPv4 中的 ip 协议采用 0x0800。

数据与填充:46~1500 个字节,包含了上层协议传递下来的数据,如果加入数据字段后帧长度不够 64 字节,会在数据字段加入填充字段达到 64 字节。

校验和:4 个字节,对接收网卡(主要是检测数据与填充字段)提供判断是否传输错误的一种方法,如果发现错误,则丢弃此帧。目前最为流行的用于校验和(FCS)的算法是循环冗余校验(cyclic redundancy check -- CRC)。

https

http报文是明文的,内容未经过加密,使用TSL/SSL进行加密后形成https。

http默认端口80,https默认端口443

SSL/TSL加密

SSL是TSL的前身。

对称加密,两端使用一样规则进行加解密。旁人知道规则就可以解密。

非对称加密:使用两个私钥与一个公钥进行加密。他人即便可以监控到公钥、各自私钥+公钥、总的密钥(两私钥+一公钥),也很难破解私钥,破解使用对大数的质因数分解很难。

SSL证书:确保域名安全第三方中心


__EOF__

本文作者killens
本文链接https://www.cnblogs.com/killens/p/16303690.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   killens  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示