专栏名称: 云技术实践
关注云计算,云技术,云运维,云存储,存储,分布式,OpenStack,SDN,Ceph,虚拟化,运维,分享在云计算/虚拟化/运维项目实施中的资讯、经验、技术,坚持干货。
目录
相关文章推荐
架构师之路  ·  为啥DeepSeek爆火之后,中国人想到的是 ... ·  2 天前  
美团技术团队  ·  空降复旦!上海首条高校无人机配送航线启航 ·  4 天前  
51好读  ›  专栏  ›  云技术实践

TCP 协议简介

云技术实践  · 公众号  · 架构  · 2017-08-12 20:01

正文

TCP 是互联网核心协议之一,本文介绍它的基础知识。



1 TCP 协议的作用


互联网由一整套协议构成。TCP 只是其中的一层,有着自己的分工。



图片说明:TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议。


最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。



图片说明:以太网协议解决了局域网的点对点通信。


但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。



图片说明:IP 协议可以连接多个局域网。


IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。



图片说明:路由器就是基于 IP 协议。局域网之间要靠路由器连接。


路由的原理很简单。市场上所有的路由器,背后都有很多网口,要接入多根网线。路由器内部有一张路由表,规定了 A 段 IP 地址走出口一,B 段地址走出口二......通过这套"指路牌",实现了数据包的转发。



图片说明:本机的路由表注明了不同 IP 目的地的数据包,要发送到哪一个网口(interface)。


IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。


简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。


2 TCP 数据包的大小


以太网数据包(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。


IP 数据包在以太网数据包的负载里面,它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。



图片说明:IP 数据包在以太网数据包里面,TCP 数据包在 IP 数据包里面。


TCP 数据包在 IP 数据包的负载里面。它的头信息最少也需要20字节,因此 TCP 数据包的最大负载是 1480 - 20 = 1460 字节。由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右。


因此,一条1500字节的信息需要两个 TCP 数据包。HTTP/2 协议的一大改进, 就是压缩 HTTP 协议的头信息,使得一个 HTTP 请求可以放在一个 TCP 数据包里面,而不是分成多个,这样就提高了速度。



图片说明:以太网数据包的负载是1500字节,TCP 数据包的负载在1400字节左右。


3 TCP 数据包的编号(SEQ)


一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送7100多个包。


发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。


第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。



图片说明:当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节。


4 TCP 数据包的组装


收到 TCP 数据包以后,组装还原是操作系统完成的。应用程序不会直接处理 TCP 数据包。


对于应用程序来说,不用关心数据通信的细节。除非线路异常,收到的总是完整的数据。应用程序需要的数据放在 TCP 数据包里面,有自己的格式(比如 HTTP 协议)。







请到「今天看啥」查看全文