TCP/IP 详解笔记
最早的 TCP 协议文档是 RFC793。
TCP 提供一种面向连接的、可靠的字节流服务。
面向连接容易理解,那么什么是字节流服务呢?
答:两个应用程序通过 TCP 连接交换 8 bit 字节构成的字节流。TCP 不在字节流中插入记录标识符。我们将这成为字节流服务(byte stream service)。另外,TCP 对字节流的内容不作任何解释。TCP 不知道传输的数据字节流是二进制数据,还是 ASCII 字符、EDCDIC 字符或者其他类型数据。对字节流的解释由 TCP 连接双方的应用层解释。这种对字节流的处理方式与 Unix 操作系统对文件的处理方式很相似。Unix 内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对 Unix 的内核来说,它无法区分一个二进制文件与一个文本文件。
TCP 通过下列方式来提供可靠性:
- 应用数据被分割成 TCP 认为最适合发送的数据块(UDP 协议中,应用程序产生的数据报长度将保持不变)。由 TCP 传递给 IP 的信息单位称为报文段或段(segment)。
- 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。这也就是所谓的超时及重传策略。
- 当 TCP 收到发自 TCP 连接另一端的数据时,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
- TCP 将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段,以便发端收取确认响应时超时并重发。
- 因为 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。如有必要,TCP 将对收到的数据进行重新排序,以正确的顺序交给应用层。
- IP 数据报也可能会发送重复,所以 TCP 的接收端必须丢弃重复的数据。
- TCP 还能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能容纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
TCP 首部


如果不计任选字段,TCP 首部通常是 20 个字节。
- 序号用来标识从 TCP 发端向 TCP 收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用序号对每个字节进行计数。序号是 32 bit 的无符号数,序号到达 2^32 -1 后又从 0 开始。
- 当建立一个新连接时,SYN 标志变 1。序号字段包含由这个主机选择的该连接的初始序号 ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个 ISN 加 1,因为 SYN 标志消耗了一个序号(FIN 标志也要占用一个序号)。
- 既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。只有 ACK 标志为 1 时确认序号字段才有效。发送 ACK 无需任何代价,因为 32 bit 的确认序号字段和 ACK 标志一样,总是 TCP 首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK 标志也总是被设置为 1。TCP 为应用层提供全双工服务。这意味着数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
- TCP 可以表述为一个没有选择确认或否认的滑动窗口协议(滑动窗口协议用于数据传输)。我们说 TCP 缺少选择确认是因为 TCP 首部中的确认序号表示发方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果 1 ~ 1024 字节已经成功收到,下一报文段中包含序号从 2049 ~ 3072 的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为 1025 的 ACK。它也无法对一个报文段进行否认。例如,如果收到包含 1025 ~ 2048 字节的报文段,但它的校验和错,TCP 接收端所能做的就是发回一个确认序号为 1025 的 ACK。而重复的确认可以帮助发端确定分组已经丢失。
- 首部长度给出首部中 32 bit 字的数据。需要这个值是因为任选字段的长度是可变的。这个字段占 4 bit,因此 TCP 最多有 60 字节的首部。然而,没有任选字段,正常的长度是 20 字节。
其他首部字段
| 字段名 | 字段作用 |
| URG | 紧急指针(urgent pointer)有效 |
| ACK | 确认序号有效 |
| PSH | 接收方应该尽快将这个报文段交给应用层 |
| RST | 重建连接 |
| SYN | 同步序号用来发起一个连接 |
| FIN | 发端完成发送任务 |- TCP 的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16 bit 字段,因而窗口大小最大为 65535 字节。后面还有新的窗口刻度选项,它允许这个值按比例变化以提供更大的窗口。
- 校验和覆盖了整个 TCP 报文段:TCP 首部和 TCP 数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。TCP 校验和的计算和 UDP 校验和的计算相似。
- 只有 URG 标志置为 1 时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
- 最常见的可选字段是最长报文大小,又称为 MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
从上图中可以看出:TCP 报文段的数据部分是可选的。所以我们可以从建立连接到连接终止都使用没有数据的报文段。
TCP/IP 详解笔记的更多相关文章
- TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
- TCP/IP详解 笔记一
概述: Tcp-ip让网络上的计算机进行通信,而不管计算机和操作系统是否一样. 分层结构: Tcp/ip协议族是多层协议的组合,而tcp和ip只是其中的两个协议而已. 一个通信举例: 注意图的右上方: ...
- TCP/IP详解 笔记十三
TCP协议(一) 概述 特点 1, 面向连接可靠的字节流服务 2, 只有两方通信,不能用于广播或多播 3, 应用数据被TCP分隔为最合适发送的数据段,传给IP协议栈 4, 发送端并启动定时器, ...
- TCP/IP详解 笔记十一
域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...
- TCP/IP详解 笔记九
广播和多播 多播和广播只能用于UDP包,TCP明确在两个进程间建立连接. 多播:帧只传送给属于多播组的多个接口 主机对帧的过滤过程: 通常网卡只接收那些目的地址为本物理接口地址或广播地址的帧:设置为混 ...
- TCP/IP详解 笔记八
UDP协议 UDP是传输层协议,提供无连接不可靠的数据传输,其优点失效率高,确定确定是无序不可靠. 报文格式 UDP头部 TCP和UDP的端口号是独立的 UDP长度是指UDP数据报的总长度 UDP的校 ...
- TCP/IP详解 笔记十二
简单文件传送协议 TFTP 1) 初衷是为了引导无盘系统 2) 使用UDP 3) 代码都能适合只读存储器 无盘主机通过RARP获得ip地址后进行一个TF ...
- TCP/IP详解 笔记十
IGMP Internet组管理协议 IGMP的作用:让一个物理网络上的所有系统知道主机所在的多播组: 让路由器知道多播数据报应该向哪个端口转发. IGMP有固定长度,没有可选数据,在ip头部的协议值 ...
- TCP/IP详解学习笔记
TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...
随机推荐
- mongodb基础操作
查询选择器>db.customers.find({age:{$lt:102}})查询age小于102的数据$lte表示小于或等于$gt表示大于$gte表示大于或等于>db.customer ...
- 学习 SSH
ssh_config 与 sshd_config ssh_config: configuration file for the ssh client on the host machine you a ...
- FW 配置一个私有的Docker仓库
思维 66 3月1日 发布 建分支 0 分支 收藏 0 收藏 我们在本地开发时,如果内网能部署一台Docker服务器,无疑会极大的方便镜像的分享发布,有些私有镜像就是可以直接放到内网服务器上,省去了不 ...
- Cassandra代替Redis?(转)
原文:Cassandra代替Redis? 最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例.而这篇百万用户时尚分享网站 ...
- 我的Android进阶之旅------>Android横竖屏切换总结
在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横屏一样的画面,这样会有2个问题, * 布局问题,在竖屏 显示的布局 ...
- Linux源码包安装和脚本安装
能够先 vi INSTALL 看看安装过程. 1.源码包安装 2.脚本安装
- Retrofit2.2说明-简单使用
很久前就想学习下Retrofit了,不过总是没有时间,正好最近新项目要用到网络请求,正好研究了下Retrofit2.2的简单使用方法,大致记录如下: Retrofit与okhttp共同出自于Squar ...
- 《Python 机器学习》笔记(二)
机器学习分类算法 本章将介绍最早以算法方式描述的分类机器学习算法:感知器(perceptron)和自适应线性神经元. 人造神经元--早期机器学习概览 MP神经元 生物神经元和MP神经元模型的对应关系如 ...
- PHP获取域名、IP地址的方法
本文介绍下,在php中,获取域名以及域名对应的IP地址的方法,有需要的朋友参考下. 在php中可以使用内置函数gethostbyname获取域名对应的IP地址,比如: 1 <?php 2 ech ...
- Django_Form表单补充
Form表单 问题1: 注册页面输入为空,报错:keyError:找不到password def clean(self): print("---",self.cleaned_da ...