【云计算 IT 基础知识】5.4 传输层--5.4.1 TCP

muzilan 2016-07-30 03:39:50
加精

【云计算 IT 基础知识】系列1 目录/汇总(持续更新)

------------------------------------------------------------

5.4 传输层


5.4.1 TCP



概念

传输控制协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字 节流的传输层通信协议(在RFC793中定义)。




特点

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





原理


可靠性保障

TCP通过下列方式来保障数据传输的可靠性:
l 数据被分割成TCP最适合发送的数据块,也就是最大报文段长度。当一个连接建立 时,连接的双方都要通告各自的最大报文段长度。
l 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。 如果不能及时收到一个确认将重发这个报文段。
l 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认通常将推迟 几分之一秒发送,以便将ACK与需要沿该方向发送的数据一起发送。绝大多数实现 采用的时延为200ms。
l TCP通过端到端的首部和数据的检验和,检测数据在传输过程中的任何变化。如果 收到段的检验和有差错,TCP将丢弃这个报文段并不确认收到此报文段,希望发送 端超时并重发。
l 如果TCP报文段的到达顺序错误,TCP会对收到的数据进行重新排序,将数据以正 确顺序交给应用层。
l TCP接收端会丢弃重复的数据。
l TCP可提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端 只允许另一端发送接收端缓冲区所能接纳的数据,从而防止缓冲区溢出。



建立TCP连接

TCP通过三次握手完成连接的建立,如图5-27所示。


TCP连接建立的过程:
1. 客户端执行主动打开:客户端发送SYN包给服务器,其中包含序列号X。
2. 服务器收到SYN(SEQ=X)包后,向客户端回SYN(SEQ=Y)+ACK(SEQ=X+1)包作为应答以及对客户端SYN(SEQ=X)包的确认。
3. 客户端向服务器发送ACK(SEQ=Y+1)包,对服务器SYN(SEQ=Y)包进行确认。
同时打开:在很偶然的情况下,TCP连接的两方会同时彼此执行主动打开。这种情况下,每一方必须发送一个SYN,且这些SYN必须传递给对方。每一方均使用一个对方熟知的端口作为本地端口。例如,主机A中的一个应用程序使用 地端口7000,并与主机B的端口8000执行主动打开。主机B的一个应用程序则使用本地端口8000,并与主机A的 端口7000执行主动打开。它们仅建立一条连接而不两条连接,且每一端既是客户机又是服务器。


终止TCP连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。TCP通过四次握手完成
连接的终止,如图5-28所示。



TCP连接终止的过程:
1. 客户端执行主动关闭:客户端发送FIN包给服务器,其中包含序列号X。
2. 服务器收到FIN(SEQ=X)包后,向客户端回ACK(SEQ=X+1)包作为对客户端FIN(SEQ=X)包的确认。从客户端到服务器的传送被关闭。
3. 服务器执行被动关闭:服务器向客户端发送FIN(SEQ=Y) ACK(SEQ=X+1)包。
4. 客户端向服务器发送ACK(SEQ=Y+1)包,对服务器FIN(SEQ=Y)包进行确认。从服 务器到客户端的传送被关闭。

同时关闭:TCP连接的两方都可以执行主动关闭。

异常释放:通常情况下,TCP通过发送FIN包关闭连接。若使用的是复位报文来结束连接,则称为异常释放。使用异常释放,可以使复位报文的发送方立即丢弃待发数据,减少资源浪费,而接受方可以判断出发送方是正常关闭还是异常关闭。


流量控制

为了实现流量控制,TCP使用一种滑动窗口协议。TCP连接的双方为每个连接使用一个窗口。窗口区间是缓冲区的一部分,包含一方在等待另一方的确认期间所能发送的字节数据。该窗口之所以称为滑动窗口,是因为它能随着数据的发送、确认的接收,在整个缓冲区内滑动。
TCP的滑动窗口是面向字节的。滑动窗口的使用使传输效率更高,同时也能控制数据流量,使接收端不被数据所淹没。


拥塞控制

TCP提供4种拥塞控制机制来确保有效的利用带宽,并快速修复拥塞和错误:

l 慢速启动
新建立的连接不在一开始就大量发送数据包,而是根据网络情况逐步增加每次发送的数据量。当新建连接时,拥塞窗口大小初始化为1个最大报文段长度(以字节为
单位),发送端开始按照拥塞窗口大小发送数据。每当有一个报文段被确认,拥塞 窗口大小就增加1个最大报文段长度。拥塞窗口大小的值随着网络往返时间呈指数级增长。

l 拥塞避免

当拥塞窗口大小超过慢启动门限(通常是65536字节)后,慢速启动过程结束,进入拥塞避免阶段。拥塞避免的主要思想是加法增大,即拥塞窗口大小的值不再指数级往上升,而是开始加法增加。当窗口中所有的报文段都被确认时,拥塞窗口大小加1。拥塞窗口大小的值随着网络往返时间的增加而线性增加,从而避免增长过快 导致网络拥塞,逐渐增加调整到网络的最佳值。

l 快速重传

TCP在收到乱序到达包时会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失。此时进行快速重传,包括把慢启动门限值设置为拥塞窗口大小的一半,把拥塞窗口大小重新设置为慢启动门限的值(具体实现有些为慢启动门限的值+3), 并重新进入拥塞避免阶段。

l 快速恢复

快速恢复与快速重传类似,但当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网 络中发送一个“新”的数据包。如果发送方收到一个重复的ACK,根据TCP的ACK重传机制,就表明有一个数据包离开了网络,于是拥塞窗口大小加1。




报文格式


TCP的报文格式如图5-29所示。



报文中各字段的定义如表5-11所示。







------------------------------------------------------------













...全文
1918 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
muzilan 2016-10-11
  • 打赏
  • 举报
回复
muzilan 2016-10-11
  • 打赏
  • 举报
回复
大家讨论交流,才收获多
muzilan 2016-10-11
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
还是要先学会使用抓包软件比如wireshark。
这个最实用
赵4老师 2016-08-08
  • 打赏
  • 举报
回复
还是要先学会使用抓包软件比如wireshark。
muzilan 2016-08-07
  • 打赏
  • 举报
回复
引用 3 楼 iseehell 的回复:
不明觉厉啊,TCP中包的封装和包头字段,能否来个介绍说明
TCP包头   TCP包头占有20个字节,即:   18 98 00 17 37 8d 49 3b 00 46 74 e0 50 18 fe d9 ea f7 00 00   (1) “18 98”,表示本地端口号,转换为十进制就是3368。   (2) “00 15”,表示目标端口号,转换为十进制就是23,因为我是连接TELNET站点,所以,这个就是23。   (3) “37 8d 49 3b”,是顺序号(Sequence Number),简写为SEQ。   (4) “00 46 74 e0”,是确认号(Acknowledgment Number),简写为ACKNUM。   (5) “50 18”,转换为二进制,“0101 0000 0001 1000”。这两个字节,总共16bit,有好多东西。第一个4bit“0101”,是TCP头长,十进制为5,表示20个字节。接着的6bit现在TCP协议没有用上,都为0。最后的6bit“01 1000”是六个重要的标志。这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类。下面是一些介绍:    URG:(Urgent Pointer field significant)紧急指针。用到的时候值为1,用来处理避免TCP数据流中断。   ACK:(Acknowledgment fieldsignificant)置1时表示确认号(AcknowledgmentNumber)为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。   PSH:(Push Function),PUSH标志的数据,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。   RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。  SYN:(Synchronize sequence numbers)用来建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即,SYN和ACK来区分Connection Request和Connection Accepted。    FIN:(No more data from sender)用来释放连接,表明发送方已经没有数据发送了。    这6个标志位,对号入座。本例中SYN=0,ACK=1,当然就是表示连接请求了。在分析TCP包头时候,要注意这两位的变换。    (6) “fe d9”,窗口值,用来控制实现流量控制。   (7) “ea f7”,检验和,TCP的检验和是强制的。   (8) “00 00”,紧急指针。
iseehell 2016-08-03
  • 打赏
  • 举报
回复
不明觉厉啊,TCP中包的封装和包头字段,能否来个介绍说明
muzilan 2016-08-02
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
《TCP-IP详解卷一:协议》 《TCP-IP详解卷二:实现》 《TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》
仔细研读啊
赵4老师 2016-08-01
  • 打赏
  • 举报
回复
《TCP-IP详解卷一:协议》 《TCP-IP详解卷二:实现》 《TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》

448

社区成员

发帖
与我相关
我的任务
社区描述
云计算开发
社区管理员
  • 云计算
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧