【TCP/IP协议详解】

一、TCP/IP协议简介

  TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。
  TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有TelnetFTPSMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有TCPUDP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMPIPIGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网络接口层或数据链路层,主要协议有ARPRARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。

二、OSI七层参考模型

  OSI的参考模型共有7层,是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。由低层至高层分别为:物理层数据链路层网络层传输层会话层表示层应用层
OSI七层参考模型

2.1 OSI七层参考模型与TCP/IP协议模型各层对应关系

OSI七层参考模型与TCP/IP协议模型各层对应关系

三、TCP报文结构

  下图为TCP首部结构定义,定义了TCP协议如何读取和解析数据。
TCP报文结构

3.1 TCP端口

  TCP的连接需要四个要素来确定唯一的连接:源IP + 源端口、目的IP + 目的端口, 因此TCP首部预留了两个16位作为端口号的存储,IP地址由上一层IP协议负责传递。源端口和目的端口各占16位,即两个字节,因此端口号的范围为216=65536(0 ~ 65535)。此外0 ~ 1023端口是系统保留的,1023 ~ 65535是用户使用的端口范围。

3.2 TCP的序号和确认号

  ① 序号(Sequence number,缩写seq,32位):用于标识数据包在数据流中的位置。发送数据包时数据比较大时则需要分片,序号则用来区分不同的分片并排序,确保了数据的顺序性。
  ② 确认号(Acknowledge number,缩写ack,32位):确认数据是否被收到,一般为收到的序号值 + 1。只有 ACK 标志为 1 时确认序号字段才有效。

3.3 数据偏移

  表示TCP报文首部长度, 即TCP报文段的数据起始处距离TCP报文段的起始处的长度。以4字节为单位,占4位,取值范围为0~15。由此可计算出TCP首部的最大字节数为 4 * 15 = 60TCP首部长度 - 20(固定首部长度) = 选项长度

如果数据偏移值为5,则整个TCP报文头的长度是4 * 5 = 20字节,相当于TCP首部不包含选项。
如果数据偏移值为15,则整个TCP报文头的长度是4 * 5 = 60字节,相当于TCP首部中选项占40字节。

3.4 保留位

  占6位,默认为0。

3.5 TCP控制位

  URG:紧急标志位,表示数据包的紧急指针生效,数据具有高优先级,优先传送,而不按照原先的队列顺序传送,督促中间设备尽快处理;
  ACK:确认标志位,对已接收的数据包进行确认;
  PSH:推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
  RST:重置标志位,用于连接复位、拒绝错误和非法的数据包;
  SYN:同步标志位,用于建立会话连接,同步序列号;
  FIN:完成标志位,表示数据传输已经完成,即将关闭连接;

3.6 窗口

  表示该报文的发送方能接受的字节数,即窗口大小,传输过程中双方可以动态调整窗口大小,即用来控制数据传输速率。一个TCP数据包大小,最大则为65535(216 - 1)字节,除去头部20字节,理论上可携带的最大数据量为65515字节。

3.7 检验和

  用于验证数据完整性,确保数据未被修改。检验和覆盖了整个 TCP 报文段,包括 TCP 首部和 TCP 数据,发送端根据特定算法对整个报文段计算出一个检验和,接收端会进行计算并验证。

3.8 紧急指针

  只在URG标志位置1的时候有效。表示紧急数据在TCP数据中的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

3.9 选项

  非必须,长度可变,最大长度为40字节。用于在TCP头部中传输一些额外的控制信息。

3.10 填充

  非必须,填充字段,用来补位,使整个首部长度是4字节的整数倍。

四、TCP/IP协议的三次握手与四次挥手

4.1 TCP/IP协议的三次握手

TCP/IP协议的三次握手

名称数据发送方向SYN(建立连接)seq(自己的数据)ACK(收到的请求)ack(接收到的对方的数据)
第一次握手客户端 --> 服务端1x--
第二次握手服务端 --> 客户端1y1x + 1
第三次握手客户端 --> 服务端-x + 11y + 1

4.2 TCP/IP协议的四次挥手

TCP/IP协议的四次挥手

名称数据发送方向FIN(断开连接)seq(自己的数据)ACK(收到的请求)ack(接收到的对方的数据)
ack = seq + 1
第一次挥手客户端 --> 服务端1u--
第二次挥手
(期间仍存在数据传输)
服务端 --> 客户端-v1u + 1
第三次挥手服务端 --> 客户端1w1u + 1
第四次挥手客户端 --> 服务端-u + 11w + 1

4.3 常见问题

  1. 为什么需要三次握手?

  ① 防止旧连接的混淆。 由于网络延迟等原因,可能会出现旧连接的数据包在新连接中被误认为是有效数据包的情况。
  ② 建立可靠连接。 三次握手才可以同步双方的初始序列号,序列号能够保证数据包不重复、不丢弃和按序传输。两次握手无法防止历史连接,也无法同步双方序列号。
  ③ 避免资源浪费。 三次握手可以防止未经授权的恶意连接,例如SYN洪泛攻击等。如果服务器收到的SYN包并没有相应的ACK包,那么服务器就不会认为这是一条有效的连接请求,从而防止恶意连接。

  2. 为什么四次挥手的第二次和第三次挥手不能合并?

  ① 第二次挥手的目的是服务端告诉客户端,我(服务端)已经收到你(客户端)发送的包了。
  ② 第三次挥手的目的是服务端告诉客户端,我(服务端)的数据也已经发送完毕了,不会再发送数据了。
  因此,第二次挥手主要是对第一次挥手的响应,第三次挥手主要是告知客户端,服务端已经不会再发送数据了。在第二次挥手和第三次挥手之间,服务端还是可以向客户端发送数据的, 因此第二次挥手和第三次挥手不能合并。

  3. 三次握手和四次挥手的目的是什么?

  ①三次握手的目的是保证双方都准备好了资源,双方的发送和接收能力都正常。
  ②四次挥手的目的是保证双方的资源都能正常释放掉。

  4. 服务端收到第四次挥手的数据包之前,会释放掉资源么?

  不会, 即使服务端调用了close(),仍然会保留资源,直到收到客户端的发来的第四次挥手的数据包为止。当然,如果服务端一直没有收到第四次挥手的数据包,服务端会认为是不是第三次挥手的数据包丢失了,不断重试第三次挥手,重试一定次数,仍然没有收到,服务端直接断开连接。

  5. 第三次挥手什么时候发?

  服务端调用close()之后才能发。

  6. TCP/IP协议在第四次挥手时为什么要等待2MSL(最长报文段寿命,Maximum Segment Lifetime)?

  ① 保证客户端发送的最后一个ACK报文段能够到达服务端。 因为该ACK有可能丢失,从而导致处在LAST-ACK状态的服务端收不到对FIN-ACK的确认报文。
  ② 防止"已失效的连接请求报文段"出现在本连接中。 客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现滞留在网络中的报文段。

  7. 为什么客户端先调close(),而服务器不能先调?

  ① 先调用close()的一方需要等待2MSL之后才能释放资源,在这段时间期间时不允许用bind的方式去重新绑定端口的,这时就会出现端口被占用的情况。
  ② 客户端的端口是由操作系统随机分配的,被占用之后会再重新分配一个,而服务端先调close(),则需设定套接字选项,配置重复利用端口资源才可以。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZTH_Zero

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

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

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

打赏作者

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

抵扣说明:

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

余额充值