第8章 传输层(3)_TCP协议
3. 传输控制协议(TCP)
3.1 TCP协议的主要特点
(1)TCP是面向连接的传输层协议。即使用TCP协议之前必须先建立TCP连接。在传送数据完毕之后,必须释放己经建立的TCP连接。
(2)每一条TCP连接只能有两个端点,即只能是一对一的。
(3)TCP提供可靠交付服务,也就是说通过TCP连接传送的数据,无差错、不丢失、不重复且按序发送。
(4)TCP提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。这就允许通信双方在任何时候都可以发送数据。
(5)面向字节流
①TCP中的“流”是指流入到进程或从进程流出的字节序列。“面向字节流”的含义是:是指TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。它并不知道所传送的字节流的含义(如是一个整型或自定义的结构体),其含义由应用层的接收双方自行协商的,但到了传输层其意义就不存在了。
②UDP发送的报文长度是应用程序给了的。但与UDP不同,如果应用程传送到TCP缓存的数据块太长,TCP就会把它划分得短一些再传送。如果应用程序一次只发一个字节,TCP会等待积累到足够多字节后再构成报文发送出去。一个TCP报文段的大小,只是根据对方给出的窗口值和当前网络的拥塞程度来决定的。
3.2 TCP报文的首部格式
(1)抓包分析TCP

(2)TCP首部

①TCP报文分为首部和数据两个部分。TCP的全部功能都体现在它首部的各个字段的作用,只有弄清首部各字段的作用才能掌握TCP的工作原理。
②TCP首部的前20个字节是固定的,后面的4N个字节是根据需要而增加的(N为整数),因此TCP首部的最小长度是20字节。
3.3 TCP首部各字段含义
(1)源端口和目的端口:各占2个字节。和UDP一样,使用端口号来标识不同的应用层协议。
(2)序号:占4个字节,共232个序号,序号从0开始,增到最大时,下一个序号会循环回到0。一个TCP连接中传送的字节流的每一个字节都按顺序编号。而序号字段表示本报文段所发送的数据的第一个字节的序号。
(3)确认号:占4个字节,是期望收到下一个报文段的第一个数据字节的序号。应记住:若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。

(4)数据偏移:占4位二进制,单位是4字节。它指出TCP报文段的数据起始处距离TCP报文段的起始的偏移,实际上就是指出TCP报文段的首部长度。
(5)保留:占6位。保留为今后使用,但目前应置为0。
(6)紧急URG(Urgent)。当URG=1时,表示紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送。(注意,该标志位只是告诉TCP,优先发送本报文段。但接收方是否优先把该数据报尽快交付(推送)给应用程序是由push标志位来决定的)
(7)确认ACK(Acknowlegment):当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
(8)推送(Push):当两个应用进程进行交互的通信时有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。(即接收方优先接收这个数据包,就优先交付给其上的应用程序,而不再等到整个缓存都填满后再向上交付!)。实际中很少使用该字段。
(9)复位RST(Reset):当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
(10)同步SYN(Synronization):在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置1就表示这是一个连接请求或连接接受报文。
(11)终止FIN(Finish):用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。
(12)窗口 。占2个字节。窗口值是[0,216-1]之间的整数,主要起着流量控制的作用。其意义在于告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位是字节)。
①由于TCP的确认机制也让TCP连接双方的数据传输速度变慢,也就是说,一方发送数据需要等待对方的确认才继续发送后续数据。为了充分利用双方的带宽及缓冲区(Buffer),发送方不必等待对方的确认,可以连续发送多个数据包给对方,而对方可以暂时把这些数据存放在缓冲区,并给对方一个总确认。这样,可以大大增加数据传输的速度。
②可见,之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。使用TCP协议传输数据的计算机会根据自己的接收能力让对方参数这个窗口值来调整数据发送的速率,从而达到流量控制的功能。
(13)检验和。占2个字节。检验的范围包括首部和数据这两个部分。其检验方法与UDP类似,也要临时添加一个伪首部。只是伪首部的第4个字段的17改为16,第5个字段的UDP长度改为TCP长度。若使用IPv6,则伪首部也要相应的改变。
(14)紧急指针。占2个字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),由于紧急数据是从数据部分的开始处算起,因此,紧急指针也是紧急数据的长度。
(15)选项:长度可变,最长可达40个字节。当没有使用选项时,TCP的首部长度是20个字节。该选项中通常可以设置MMS、窗口扩大选项和时间戳等。

①TCP最长报文段长度(MMS),并不是整个TCP报文段的最大长度,而是数据字段的最大长度。
②受数据链路层最大传输单元(MTU)的限制,以太网的MTU默认是1500字节。因此TCP报文段数据部分的最大长度(MMS)为1460字节。
③若选择较小的TCP报文段太小,则网络的利用率就低。反之,如果TCP报文段太长,那么在IP层就可能被分解成多个短数据报片,当传输出错时要进行重传以及到达终点还要还原成原来的TCP报文,这些都会使网络开销增大。
④因此,MMS应尽可能设置大些,只要在IP层传输时不需要再分片就行。若主机未填写MMS,默认为536字节。因此所有因特网上的主机都应能接受的报文长度是536+20(固定首部长度)=556字节。
第8章 传输层(3)_TCP协议的更多相关文章
- 第8章 传输层(1)_TCP/UDP协议的应用场景
1. 传输层的两个协议 1.1 TCP和UDP协议的应用场景 (1)TCP协议:如果要传输的内容比较多,需要将发送的内容分成多个数据包发送.这就要求在传输层用TCP协议,在发送方和接收方建立连接,实现 ...
- 第6章 传输层(详解TCP的三次握手与四次挥手)
第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...
- Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...
- 传输层:TCP 协议
传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...
- 【知识强化】第五章 传输层 5.3 TCP协议
这节课我们来学习一下TCP协议的特点以及TCP报文段的格式. 首先呢我们来看一下TCP有哪些特点呢.之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议 ...
- 数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点
上一博客记录了UDP协议的关键要点,这部分记录TCP协议的关键要点. 24.3 传输控制协议(TRANSMISSION CONTROL PROTOCOL) TCP(Transmission Contr ...
- 数据通讯与网络 第五版第24章 传输层协议-UDP协议部分要点
24.1 介绍 本章节主要集中于传输层协议的解读,图24.1展示TCP.UDP.SCTP在TCP\IP协议栈的位置 24.1.1 服务(Service) 每个协议都提供不同的服务,所以应该合理正确的使 ...
- 【知识强化】第五章 传输层 5.2 UDP协议
这节课我们来学习一下UDP协议. 那在上节课呢我们学了这样一个打油诗. 啊,就是传输层有两个好兄弟,大哥TCP和二弟UDP.大哥很靠谱,二弟不靠谱.那只要说到UDP协议我们就要知道它的一个重要的特点, ...
- Linux内核--网络栈实现分析(九)--传输层之UDP协议(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7549340 更多请查看专栏,地 ...
随机推荐
- Singer 学习九 运行&&开发taps、targets (四 开发target)
singer 的target 需要从stdin 的行数据,同时处理schema.record.state 消息 指南 schema 需要进行关联stream records 数据的校验 一旦Targe ...
- python之路---11 第一类对象 函数名 闭包 迭代器
二十九. 1.函数名的运用 ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址 ③ 函数名可以赋值给其他变量 ④函数名可以当 ...
- xml配置*的问题
spring配置种classpath * 和classpath的问题,class path有多个的情况下,会匹配第一个 <context:component-scan/>中两个**表示可以 ...
- 设置Redis最大占用内存
https://blog.csdn.net/happyrabbit456/article/details/54945667 Redis需要设置最大占用内存吗?如果Redis内存使用超出了设置的最大值会 ...
- windows下安装python-Levenshtein
安装python-Levenshtein 报错 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Vi ...
- linux 服务器之间配置免密登录
客户机:172.16.1.2 远程机:172.16.1.3 1.远程机 a.允许root用户通过22端口登录 vi /etc/ssh/sshd_config PORT 22 PermitRootLog ...
- 《JavaScript设计模式与开发》笔记 1.面向对象的JavaScript
多态 封装 原型模式 基于原型模式的继承javascript对象 1.多态 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果.换句话说,给不同的对象发哦少年宫同一个消 ...
- 深入理解 JavaScript 中的函数
JavaScript函数也具有这些特性,但它们不仅仅是常规函数.JavaScript函数是对象.你可以查看我曾经写的关于JavaScript对象的文章,里面我提到几乎JavaScript中的所有一切都 ...
- linux mongodb 及php-mongo扩展安装
安装背景 php7.2.5 ubuntu18.04.1 MongoDb 安装 sudo apt-get install mongodb MongoDb的php扩展 sudo apt-get i ...
- 关于Java与Map的那点事
Java将Map拼接成“参数=值&参数=值”: 把一个map的键值对拼接成“参数=值&参数=值”即“username=angusbao&password=123456”这种形式 ...