一、分组交换网络

- 古老的电话通信,一根电缆,两个用户设备通信
![](https://img2018.cnblogs.com/blog/1226829/201810/1226829-20181008213243720-379255914.png)

  • 计算机中的两个设备节点通信:分组网络

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

基本TCP通信原理就这样

 

二、TCP数据报

![](https://img2018.cnblogs.com/blog/1226829/201810/1226829-20181008214056532-532264164.png)

  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的数据传输是不可靠的。

TCP 原理的更多相关文章

  1. 从tcp原理角度理解Broken pipe和Connection reset by peer的区别

    从tcp原理角度理解Broken pipe和Connection reset by peer的区别 http://lovestblog.cn/blog/2014/05/20/tcp-broken-pi ...

  2. DNS原理-HTTP原理-TCP原理

    第一章:企业DNS原理 相信大家都知道windows和linux的hosts文件是:IP地址和域名的对应关系,我们一般访问网站的步骤: 打开网页-----输入网址-------查看本地的DNS库是否存 ...

  3. 【lwip】12-一文解决TCP原理

    目录 前言 12.1 TCP协议简介 12.2 TCP相关的一些概念词 12.2.1 MSL 12.2.2 MSS 12.3 TCP工作特性 12.3.1 面向连接 12.3.2 全双工通信 12.3 ...

  4. TCP原理

    1.http://coolshell.cn/articles/11564.html 2.http://coolshell.cn/articles/11609.html 3.一站式学习wireshark ...

  5. TCP协议下大数据传输IOCP乱序问题

    毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...

  6. 《TCP/IP网络编程》

    <TCP/IP网络编程> 基本信息 作者: (韩)尹圣雨 译者: 金国哲 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115358851 上架时间:2014-6- ...

  7. 实验 Attacks on TCP/IP Protocols

    ------- 转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html ------- 1 实验目的 进行这个实验的目的 ...

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

    TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的 ...

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

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

随机推荐

  1. IPerf——网络测试工具介绍与源码解析(1)

    IPerf是一个开源的测试网络宽带并能统计并报告延迟抖动.数据包丢失率信息的控制台命令程序,通过参数选项可以方便地看出,通过设置不同的选项值对网络带宽的影响,对于学习网络编程还是有一定的借鉴意义,至少 ...

  2. Window快捷键

    1.带windows 键 Win + E 打开文件夹 Win + R 调出运行命令 Win + T 显示任务栏,并在在其中切换 Win +Pause 显示系统属性 Win + Home 最小化 / 还 ...

  3. 为什么会出现Notice: Undefined index: submit in D:\xampp\htdocs\test.php on line 19

    事例如下": <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  4. Qt在多线程中使用信号槽的示例

    之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...

  5. 【算法】LeetCode算法题-Reverse Integer

    这是悦乐书的第143次更新,第145篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出.例如: 输入: 123 ...

  6. JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】

        一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...

  7. 【DB2基础】DB2编目和数据库连接

    1.编目节点和编目数据库 编目(Catalog),是在本地或远程建立客户端到服务器的数据库连接的过程.其目的在于获取编目信息,即生成用来访问数据库的目录. 系统数据库目录包含一个列表和指针,通过目录可 ...

  8. own address as source address

    1222.762730] br0: received packet on nbif0 with own address as source address[ 1222.769697] br0: rec ...

  9. 近日使用Taro框架的一点小心得

    1.yarn npm安装的包,跟权限问题有关,与网络也有关 2.Vue框架首先,是解决了view-model的问题,解放开发的双手,使得显示和数据和控制分开 3.当你觉得最近没有技术文章看时,就看收藏 ...

  10. 让vue-cli脚手架搭建的项目可以处理vue文件中postcss语法

    图中&属于postcss的语法,这样书写样式可以清楚的看出选择器之前的层级关系,非常好用. 在利用vue-cli脚手架搭建的项目中如果不配置是不支持这种写法的,这样写不会报错,但是样式不生效. ...