面向连接的传输层协议——TCP/IP协议

TCP/IP 协议 TCP:Transmission Control Protocol 传输控制协议
TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议 和 传输层的TCP协议组成。
通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
IP层:

  • 接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
  • IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
TCP:
  • TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
  • TCP提供的是一种可靠的数据流服务,采用"带重传的肯定确认"技术来实现传输的可靠性。
  • TCP还采用一种称为"滑动窗口"的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
TCP 了解:
TCP是一种传输层通信协议。 它在应用程序间建立了一条虚拟链路。

TCP具有6个特点:
面向连接的传输; 端到端的通信; 高可靠性,确保传输数据的正确性,不出现丢失或乱序; 全双工方式传输; 采用字节流方式,即以字节为单位传输字节序列; 紧急数据传送功能。

在TCP/IP协议中传输层具有四个主要任务:
组包、 通过滑动窗口实现连接控制、 寻址、 通过序号确认来提供可靠性。

面向连接的传输层协议——TCP/IP协议
文章图片

TCP协议段格式: 面向连接的传输层协议——TCP/IP协议
文章图片

TCP首部结构如下:
面向连接的传输层协议——TCP/IP协议
文章图片

面向连接的传输层协议——TCP/IP协议
文章图片

源/目的端口:认识端口号
各占2字节。 端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口才能实现。 表示数据是从哪个进程来, 到哪个进程去; (端口是传输层与应用层的服务接口)

序号 & 确认号:
序号: 占4字节。 TCP连接中传送的数据流中的每一个字节都编上一个序号。 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。确认号: 占4字节。 是期望收到对方的下一个报文段的数据的第一个字节的序号。

数据偏移:
占4位。4位TCP报头长度,即数据偏移。 它指出 TCP报文段的 数据起始处距离TCP报文段的起始处有多远。 “数据偏移”的单位是32位字(以4字节为计算单位)。 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60。

保留:占6位,保留为今后使用,但目前应置为0。
6位标志位(每个标志位只占了 1 个比特):
紧急URG:当URG=1时,表明紧急指针字段有效。 它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。确认ACK:只有当ACK=1时确认号字段才有效。 ACK=0时,确认号无效。推送PSH:当TCP收到PSH = 1的报文段,就尽快地交付接收应用进程, 而不再等到整个缓存都填满了后再向上交付。 提示接收端应用程序立刻从TCP缓冲区把数据读走。复位RST:当RST=1时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因), 必须释放连接,然后再重新建立运输连接。同步SYN: 请求建立连接; 把携带SYN标识的称为同步报文段(在连接建立是用来同步序号) SYN=1,ACK=0,连接请求; SYN=1,ACK=1,同意建立连接终止FIN:用来释放一个连接。 FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

窗口:
占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。 TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小, 然后通知对方以确定对方的发送窗口的上限。表明当前允许发送方发送的数据量是以1个字节为单位的, 在TCP当中,使用的是大小可变的窗口机制进行流量控制的(接收方对发送方的流量控制)

检验和 & 紧急指针:
检验和:占 2 字节。 检验和字段检验的范围包括首部和数据这两部分, 在计算检验和时,要在 TCP 报文段的前面加上12字节的伪首部。紧急指针:占 16 位。 指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

选项 & 填充:
选项:长度可变。TCP最初只规定了一种选项,即 MSS(最大报文段长度Maximum Segment Size)。 MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。” MSS是 TCP 报文段中的数据字段的最大长度,数据字段加上TCP首部才等于整个的TCP报文段。填充:为了使整个首部长度是 4 字节的整数倍。 TCP 数据部分的最大长度 MSS=TCP 报文段长度 - TCP 首部长度

基于TCP应用层协议:
HTTP HTTPS SSH Telnet FTP SMTP 当然, 也包括自己写TCP程序时自定义的应用层协议;

TCP小结
为什么TCP这么复杂? 因为要保证可靠性,同时又尽可能的提高性能。
  • 可靠性:校验和序列号(按序到达) 确认应答 超时重发 连接管理 流量控制 拥塞控制
  • 提高性能:滑动窗口 快速重传 延迟应答 捎带应答
  • 其他:定时器(超时重传定时器, 保活定时器, TIME_WAIT定时器等)
【面向连接的传输层协议——TCP/IP协议】确认应答、超时重发、连接管理、流量控制 等等可以参考这篇博客学习:TCP协议——机制
再推荐一篇博客,很重要:TCP三次握手 & 四次挥手

    推荐阅读