TCP 原理

一、分组交换网络

?

  • 古老的电话通信,一根电缆,两个用户设备通信
  • 计算机中的两个设备节点通信:分组网络

计算机网络采取分组交换技术,意思就是我有【一块数据】要发给对方,那我会把这【一块数据】分成N份【单位数据】,分别发出去,而每份【单位数据】走哪条路是不一定的,但是这些【单位数据】总要全部达到对方手里,对方再根据【单位数据】里记录的序号拼接起来,组成完整的【一块数据】。这就是分组的意思所在。

基本TCP通信原理就这样

?

二、TCP数据报

?

  1. 端口号:用来标识同一台计算机的不同的应用进程。
    ?
    1)源端口:源端口和IP地址的作用是标识报文的返回地址。
    ?
    2)目的端口:端口指明接收方计算机上的应用程序接口。
    ?
    TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
  2. 序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
  3. 数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
  4. 保留:为将来定义新的用途保留,现在一般置0。
  5. 控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
    ?
    1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
    ?
    2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
    ?
    3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
    ?
    4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
    ?
    5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
    ?
    6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
  6. 窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
  7. 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
  8. 紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
  9. 选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
  10. 数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

参考文章:请点击

?

三、TCP的可靠原理

?
UDP为不可靠数据服务,不保证数据报能到达对方,可能丢包;而TCP的可靠是相对UDP的,另外处于传输层之下的IP层也是不可靠的,仅提供尽力而为的端到端数据传输服务(best-effort delivery service),不作任何保证。所以TCP的可靠性是指基于不可靠的IP层在传输层提供可靠的数据传输服务,主要是指传输数据不会损坏或丢失,而且所有数据都是按照发送顺序进行传送。实现TCP的可靠传输有以下机制:

  1. 校验和(校验数据是否损坏)
  2. 定时器(分组丢失则重传)
  3. 序号(用于检测丢失的分组和冗余的分组)
  4. 确认(接收方告知发送方正确接收分组以及期望的下一个分组)
  5. 否定确认(接收方通知发送方未被正确接收的分组)
  6. 窗口和流水线(用于增加信道的吞吐量)

至于数据是否在中途被修改或者被窃听,这应该是属于安全性问题。提高安全性最根本的办法就是加密数据,比如远程登录用ssh而非telnet。

TCP只能保证数据的完整性,不能保证安全性
要保证安全性只能依靠:MD5/SHA 的哈希算法,进行数字签名。

?

3.2 数据校验和重传

?
每个Tcp连接在内核中都有一个发送缓冲区和一个接收缓冲区。tcp协议要求对方在接受到tcp数据报之后,要对其该数据包序号进行ACK应答(ack=该数据包序号),只有当接受到一个tcp数据报的ACK之后,才可以把这个tcp数据报从socket的发送缓冲区清除,另外tcp还有一个流量控制功能,tcp的socket接受缓冲区接受到网络上来的数据缓存起来后,如果应用程序一直没有读取,

socket接收缓冲区满了之后,发生的动作是:通知对端TCP协议中的窗口关闭,这便是滑动窗口的实现,保证TCP socket接收缓冲区不会溢出,因为对方不允许发送超过所通知窗口大小的数据, 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。这两点保证了tcp是可靠传输的。

也可以这么回答

  1. 对数据块分包序号,编号。确保完整
  2. 接收端确认和重传机制,对每个数据包都要 ACK=该包序号,确认收到
  3. 数据校验,对数据长度简单校验,无法确保安全,只能确保可靠
  4. 流量控制
  5. 拥塞控制

重传可能原因:
1.、在中间节点丢了。2、还在路上,走的慢。3、接收端的ACK确认报文在传输中途丢失。 4、接收端异常未响应ACK或被接收端丢弃

重传原理参考本文

重传原理参考本2

两次duplicated ACK肯定是乱序造成的!
丢包肯定会造成三次duplicated ACK!

假定通信双方如下,A发送4个TCP Segment 给B,编号如下,N-1成功到达,因为A收到B的
ACK(N),其它按照到达顺序,分别收到ACK(N)的数目:
A ---------> B

A方发送顺序N-1,N,N+1,N+2

B方到达顺序

N-1,N,N+1,N+2
A收到1个ACK (N)

N-1,N,N+2,N+1
A收到1个ACK (N)

N-1,N+1,N,N+2   (接收方乱序)
A收到2个ACK (N)

N-1,N+1,N+2,N
A收到3个ACK (N)

N-1,N+2,N,N+1
A收到2个ACK (N)

N-1,N+2,N+1,N
A收到3个ACK (N)

如果N丢了,没有到达B

N-1,N+1,N+2
A收到3个ACK (N)

N-1,N+2,N+1
A收到3个ACK (N)

TCP segment 乱序 有2/5 = 40% 的概率会造成A收到三次 duplicated ACK(N);
而如果N丢了,则会100%概率A会收到三次duplicated ACK(N);

基于以上的统计,当A接收到三次 duplicated ACK(N)启动 Fast Retransmit 算法是合理的,即立
马retransmit N,可以起到Fast Recovery的功效,快速修复一个丢包对TCP管道的恶劣影响。

而如果A接收到二次 duplicated ACK(N),则一定说明是乱序造成的,即然是乱序,说明 数据都到
达了B,B的TCP负责重新排序而已,没有必要A再来启动Fast Retransmit算法

?

UDP 不可靠原理(丢包原理之一)

UDP只有一个socket接收缓冲区,没有socket发送缓冲区,即只要有数据就发,不管对方是否可以正确接受。而在对方的socket接受缓冲区满了之后,新来的数据报无法进入到socket接受缓冲区,此数据报就会被丢弃,udp是没有流量控制的,故UDP的数据传输是不可靠的。

原文地址:https://www.cnblogs.com/shiqi17/p/9757664.html

时间: 2024-08-04 10:32:01

TCP 原理的相关文章

TCP原理

1 # http 2 # smtp 3 # dns 4 # ftp:下载上传文件 5 # ssh 6 # snmp 7 # dhcp 8 # icmp ping :网络层 (其他都是在传输层之上 都是应用层 ) 9 10 # 数据的交换: 收/发两个步骤 11 # OSI七层模型: 12 # 物理层 13 # 数据链路 mac(十六进制) 计算机只认识mac地址 14 # 网络 IP 双方互相识别 15 # TCP/IP:三次握手四次断开 16 # A-> syn ->B 发起建立连接的请求

【TCP/IP网络编程】:05TCP原理 --简单描述

本篇文章主要对TCP原理进行简单的分析和讨论. TCP套接字中的I/O缓冲 前文有介绍过TCP通信数据无边界的特性,即本端一次发送的数据对端并不一定一次性接收,那剩余的数据在哪里呢? 实际上,write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据.如下图所示,write函数调用瞬间,数据将移至输出缓冲区(适当的时侯传向对方的输入缓冲):read函数调用瞬间,从输入缓冲区读取数据. TCP套接字的I/O缓冲 TCP的I/O缓冲有如下特点: I/O缓冲在每个TCP套接字中单独存在

《TCP/IP网络编程》

<TCP/IP网络编程> 基本信息 作者: (韩)尹圣雨 译者: 金国哲 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115358851 上架时间:2014-6-19 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 计算机网络 > 网络协议 > TCP/IP 更多关于>>><TCP/IP网络编程> 编辑推荐 为初学者准备的网络编程 本书涵盖操作系统.系统编程.TCP/IP协议等多种

TCP/IP网络编程系列之四(初级)

TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的套接字.在了解TCP之前,先了解一下TCP所属的TCP/IP协议栈. 如图所示,TCP/IP协议栈共分为4层,可以理解成数据收发分成了4个层次化过程. 链路层 它是物理链接领域标准化结果,也是最基本的领域,专门定义LAN.WAN.MAN等网络标准.若两台计算机通过网络进行数据交换,链路层就负责整个物

TCP—为什么是AIMD?

原文转自:http://blog.chinaunix.net/uid-28387257-id-4543179.html 说到TCP原理,一般的人谈传输效率,也就是吞吐率,了解的人谈公平性,以及收敛性.本篇博文讲一下TCP为什么使用AIMD策略,为什么是收敛的? 1.公平性和收敛性 才接触网络协议的人可能会问:为什么要收敛和公平?TCP不是传输可靠.够快就行了吗?远远不够,因为TCP是端到端的,窗口增减也是试探性的“自适应”方式,网络是黑盒,这就有很多问题.你自己一个人发包发得快,侵略性强,没有太

TCP/IP网络编程之基于TCP的服务端/客户端(二)

回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服务端的I/O代码 echo_server.c --while ((str_len = read(clnt_sock, messag, 1024)) != 0) write(clnt_sock, messag, str_len);-- 接着,我们回顾客户端的代码 echo_client.c -- wr

TCP***的主要特征是什么?

大多数人说知道DDOS*** .CC***就是不知道TCP***是什么,近期发现TCP***逐渐增加.因此得出,后续TCP***是DDOS***中新的发展趋势,给DDOS防御公司带来了新的挑战.趁还未普遍之际,我们就讲讲关于TCP的***原理吧!TCP(即Transmission Control Protocol),是传输控制协议/网间协议,是一种连接导向的.可靠的.基于传输层的通信协议,在网络OSI模型中,TCP属于第四层的负载均衡.那么TCP***可以理解为:***伪造源服务器IP向公网的T

深入理解TCP协议及其源代码

深入理解TCP协议及其源代码 前言 在前面实验我们分别实现了Socket 通信工具,探讨了Socket API.Socket 调用原理等.但是还没有针对某一实例进行讲解,在本实验我们将针对TCP协议进行详细分析,期待在Linux内核进行分析TCP原理. 1.Tcp基本原理 TCP是一种面向连接.可靠.基于字节流的传输协议,位于TCP/IP模型的传输层. 面向连接:不同于UDP,TCP协议需要通信双方确定彼此已经建立连接后才可以进行数据传输: 可靠:连接建立的双方在进行通信时,TCP保证了不会存在

网络技术与技术革命周末随想

无知者最好别在公共场合喷粪 周五下午下班坐地铁匆匆回家,由于老婆要去外地开几天会议,我周末就要做全职奶爸了,一想到这个就兴奋,可以和我家小小独处了,加深一下父女感情,于是哼着歌,同时看着<黑客大曝光>,时不时瞟一下旁边的美女... 一个声音顿时让我有一种想打人的冲动,于是旁边的美女在我眼里化作了漫天烟云.声音来自我的身后,透过玻璃反光能看得出是一个奇丑无比的年轻女性程序员, 身高150cm不到,体重约摸大于等于130斤,大声嚷嚷:网络没什么好学的,只要理解大概原理,能通就行,现在谁还搞网络啊,