热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TCP网络传输协议学习

网络模型七层网络模型七层网络模型说明层数名称功能传输单位举例7应用层提供应用程序间通信程序级数据FTP、HTTP、SMTP6表示层处理数据格式、数据加密等程序级数据编码、URL传

网络模型


七层网络模型


七层网络模型说明
层数名称功能传输单位举例
7应用层提供应用程序间通信程序级数据FTP、HTTP、SMTP
6表示层处理数据格式、数据加密等程序级数据编码、URL传输
5会话层建立、维护和管理会话程序级数据session认证、断点续传
4传输层建立端到端的连接数据段 segment进程、端口
3网络层寻址和路由选择数据包 packet路由器、防火墙
2数据链路层提供介质访问、链路管理帧  frame网卡、交换机
1物理层比特流传输比特  bit网线

 

 

 

 

 

 

 

 

 

 

 

 


五层网络模型


五层网络模型说明
层数名称功能传输单位举例
5应用层提供应用程序间的通信、确定进程之间通信的性质。程序级数据HTTP、SMTP
4运输层负责主机间不同进程的通信数据段TCP、UDP
3网络层负责分组交换网络中不同主机间的通信数据报IP
2数据链路层负责将网络层IP数据报组装成帧网卡、交换机
1物理层透明地传输比特流比特网线

 


 


 


 


 


 


 


 


四层网络模型


四层网络模型说明
层数名称功能应用到的协议
4应用层提供应用程序间的通信。FTP、DNS、HTTP、SMTP
3传输层提供两种端到端的通信服务TCP、UDP
2网间层负责数据的包装、寻址和路由,同时还提供网络诊断信息TCMP、IP
1网络接口层提供TCP/IP协议的数据结构和实际物理硬件之间的接口。ARP、RARP

 

 


 


 


 


 


 


TCP头部:


TCP头部各部分说明
名称功能
port number 端口号 

16位,source port 源端口号表示该报文段来自哪里,destination port目的端口号表示该报文段传给哪个上层协议或应用程序。进行TCP通信时,客户端一般使用系统自动选择的临时端口号,而服务端使用知名端口号。

32位序号(sequence number)

一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。序号值被系统初始化为某个随机值,后续的TCP报文段中序号值将被系统设置成随机值加上该报文段所携带的数据的第一个字节在整个字节流中的偏移。

32位确认号(acknowledgment number)

用作对另一方发送来的TCP报文段响应。其值是收到的TCP报文段的序号值加1。

4位头部长度(header length)

标识该TCP头部有多少个32bit,所以TCP头部最长是60Byte。

6位标志项

URG标志:表示紧急指针是否有效。ACK标志:表示确认号是否有效,一般称携带ACK标志的TCP报文段为“确认报文段”。PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。RST标志:表示要求对方重新建立连接,携带RST标志的TCP报文段称为“复位报文段”。SYN标志:表示请求建立一个连接,携带SYN标志的TCP报文段为“同步报文段”。FIN标志:表示通知对方本端要关闭连接了,一般称携带FIN标志的TCP报文段为“结束报文段”。

16位窗口大小

TCP流量控制的一个手段。告诉对方本端TCP接收缓冲区还能容纳多少字节的数据,对方便可控制发送数据的速度。

16位校验和

由发送端填充,接收端对TCP报文段执行的CRC算法。以检验TCP报文段在传输过程中是否损坏。这个校验不仅包括TCP头部,也包括数据部分。

16位紧急指针

一个正的偏移量,和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。是发送端向接收端发送紧急数据的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

总结:

1、TCP的包不包含IP地址,有源端口号和目的端口号。

2、一个TCP连接需要5个元组(源ip、源port、目的ip、目的port、协议)来表示同一个连接。

3、Sequence Number 包的序号,用来解决网络包乱序问题。

4、Acknowledgement Number ,即ACK  用于确认收到,解决不丢包的问题。

5、Window,即Advertised-Window,滑动窗口,用于流控问题。

6、Tcp Flag,包的类型、用于操控TCP的状态机。


3次握手4次挥手

网络上的传输是没有连接的,TCP也一样,所谓的“连接”,其实只是在通信的双方维护一个“连接状态”。


3次握手:

1、第一次握手:建立连接,客户端发送SYN包到服务器,等待服务器确认。

2、第二次握手:服务器收到SYN包,发送确认包ACK,同时发送自己的SYN包到客户端。

3、第三次握手:客户端收到服务器的SYN包,向服务端发送确认包ACK。

三次握手完成,客户端和服务器进入ESTABLISHED状态。3次握手建立连接,主要是初始化Sequence Number的初始值,通信双方要互相通知对方自己的初始化Sequence Number值,这个序号作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序(TCP会用这个序号来拼接数据)。


4次挥手:

TCP的连接时全双工(同时发送和接收),因此在关闭连接的时候,必须关闭两个方向上的连接。

1、第一次挥手:客户端发送FIN包,关闭连接。

2、第二次挥手:服务端收到客户端的FIN包,发送ACK包。

3、第三次挥手:服务端发送FIN包,关闭连接。

4、第四次挥手:客户端收到服务端的FIN包,发送ACK包。

四次挥手完成,TCP连接断开。TCP是全双工的,发送方和接收方都需要FIN包和ACK包。只不过,有一方是被动的,所以看上去就成了4次挥手。如果两边同时断连接,则就会进入到CLOSING状态,然后到达TIME_WAIT状态。


TCP状态流转图

1、CLOSED:初始化状态。

2、LISTEN:服务端的某个socket处于监听状态,可以接受连接。

3、SYN_SENT:在服务端监听后,客户端scoket执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入SYN_SENT状态,等待服务端的确认。

4、SYN_RCVD:表示服务端接受到SYN报文,在正常情况下,这个状态是服务端在建立TCP连接时的3次握手会话过程中的一个中间状态。

5、ESTABLISHED:表示连接已经建立了。

6、FIN_WAIT_1:其中一方请求终止连接,等待对方的FIN报文,就进入此状态。

7、FIN_WAIT_2:在此状态下的socket表示半连接,即有一方要求关闭连接,但另外一方数据为传输完毕,待稍后关闭连接。

8、TIME_WAIT:表示收到了对方的FIN报文,并发送了ACK包,等2MSL后回到CLOSED状态。

9、CLOSING:表示发送了FIN报文后,并没有收到对方的ACK报文,而是收到了对方的FIN报文。

10、CLOSE_WAIT:表示在等待关闭。此状态下考虑的是检查是否已将全部数据发送给对方。

11、LAST_ACK:被动关闭一方发送FIN报文后,等待对方的ACK报文。

2MSL等待: 在上图里有一个TIME_WAIT等待状态,这个状态又叫2MSL状态。说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态。防止最后一次握手的数据没有传送到对方那里而准备的(这不是4次握手,是第4次握手的保险状态)。这个状态很大程度上保证了双发都可以正常结束。由于socket的2MSL状态,使得应用程序在2MSL时间内无法再次使用同一个socket。故为了避免这个错误,服务器给出了一个平静时间概念,即服务器要平静的等待2MSL的时间才能进行下一次连接。

FIN_WAIT_2状态:著名的半关闭状态,在关闭连接时,客户端和服务端两次握手之后的状态。在这个状态下,应用程序还有接收数据的能力,但是已经无法发送数据。


TCP超时重传

网络异常情况:

当出现这些异常情况时,TCP就会超时重传:

TCP每发送一个报文段,就对这个报文段设置一次计时器,只要计时器设置的重传时间到了,但还没有收到确认,就要重传这一报文段。

影响超时重传机制协议效率的一个关键参数是RTO(重传超时时间)。TCP的底层网络环境是一个完全异构的互联结构。在实现端到端的通信时,不同端点之间的传输通路的性能可能存在着巨大的差异,而且同一个TCP连接在不同的时间段上,也会由于不同的网络状态具有不同的传输时延。因为TCP协议必须适应两个方面的时延差异,一个是达到不同目的端的时延差异,另一个是统一连接上的传输时延对业务量负载的变化而出现的差异。

TCP协议使用自适应算法(Adaptive Retransmission Algorithm)以适应互联网分组传输时延的变化。该算法要点是监视每个连接的性能(即传输时延),由每一个TCP的连接情况推算出合适的RTO值。当连接时延性能变化时,TCP也能够相应地自动修改RTO设定,以适应这种网络的变化。

RTT(Round Trip Time):连接往返时间,发送端从发送TCP包到接收它的立即响应所耗费的时间。在任何时刻连接的RTT都是随机的,TCP通过测量来获得连接当前RTT的一个估计值,并以该RTT估计值为基准来设置当前的RTO。

自适应算法的关键就在于对当前的RTT的准确估计,以便适时调整RTO。


TCP滑动窗口

滑动窗口主要有两个作用:1、提供TCP的可靠性;2、提供TCP的流控特性

TCP的窗口是一个16bit位字段,代表是窗口的字节容量。标准窗口最大为2的16次方=65535个字节。另外在TCP的选项字段中还包含了一个TCP窗口扩大因子。用来扩大窗口,可把原来的16bit的窗口,扩大为32bit。

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。各自的“接收窗口”大小取决于应用、系统、硬件的限制。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

滑动窗口实现面向流的可靠性来源于“确认重传”机制。TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。发送窗口只有收到对端对于本端发送窗口内字节的ACK确认,才会移动发送窗口的左边界。接收窗口只有在前面所有的段都确认的情况下才会移动左边界。前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认,一次确保对端会对这些数据重传。

应用程序在需要(如内存不足时),通过API通知TCP协议栈缩小TCP的接收窗口,然后TCP协议栈在下个时间段发送时包含新的窗口大小通知给对端,对端按通知的窗口来改变发送窗口,以此达到减缓发送速率的目的。


TCP拥塞控制

在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就是拥塞。

TCP的拥塞控制由4个核心算法组成:慢开始(Slow Start)、拥塞避免(Congestion Voidance)、快速重传(Fast Retransmit)、快速恢复(Fast Recovery)

发送方维持一个拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并在动态变化。

发送方让自己的发送窗口等于拥塞窗口,但考虑到接收方的接收能力,即发送窗口小于等于拥塞窗口。


慢开始

思路:不要一开始发送大量数据,先探测一下网络的拥塞程度,即由小到大逐渐增加拥塞窗口的大小。实时拥塞窗口大小是以字节为单位传输数据

原理:在刚刚开始发送报文段可先将拥塞窗口设置一个最大报文段MSS值,在每收到一个对新报文段确认后,将拥塞窗口增加至多一个MSS数值,当拥塞窗口足够大时,防止拥塞窗口的增长引起网络拥塞,引入了慢开始门限ssthresh


拥塞避免

拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口线性增长

拥塞控制具体过程:

1、TCP连接初始化,设置拥塞窗口初始值。

2、执行慢开始算法,拥塞窗口按指数规律增长,直到达到慢开始门限ssthresh,开始执行拥塞避免算法,拥塞窗口线性增长。

3、当网络发生拥塞,将慢开始门限ssthresh值更新为拥塞前的一半,拥塞窗口重新设置为初始化值,按步骤2执行。


快重传

快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。

快重传算法规定:发送方只要收到3个重复确认就应当立即重传对方尚未收到的报文段,无需等待设置的重传计时器时间到期


快恢复

快恢复算法有以下两个要点:

1、当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。接下来并不执行慢开始算法

2、考虑到如果网络出现拥塞的话就不会收到好几个重复确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将拥塞窗口设置为慢开始门限ssthresh的大小,执行拥塞避免算法

 

总结:TCP拥塞窗口变化的原则是加法增大、乘法减小。

 


推荐阅读
  • 三小时掌握计算机网络基础(通俗易懂)
    目录1.网络层次划分2.OSI七层网络模型3.IP地址4.子网掩码及网络划分5.ARPRARP协议6.路由选择协议7.TCPIP协议8.UDP协议 9.DNS协议 ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • python计算数据包校验和(python接口数据校验)
    本文目录一览:1、怎么用python算p值和t检验 ... [详细]
  • OSI七层模型、TCP/IP五层模型
    OSI网络互连的七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;应用层OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,为用户直接提供各种网 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • Ansem 最新雄文:软着陆后,加密市场下阶段趋势与核心叙事
    市场最糟糕的时候已经过去,以太坊合并前不太会看到新的低点;但仍需来自关注宏观市场的不确定风险。撰文:Ansem ... [详细]
  • TCP/IP详解 卷1 第一章概述
    第一章概述1.2分层网络编程通常分不同层次进行开发,每一层负责不同的通信功能。一个协议族比如TCPIP,通常是一组不同层次上多个协议的组合。一般可以认为 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 好消息: Gmail 推出pop3服务了
    终于可以用outlook来收取Gmail邮件了!pop3:pop.gmail.comsmtp:smtp.gmail.com一定要使用ssl链接,不过暂时 ... [详细]
  • 2016年8月29日当初想的太简单~~~哎写在前面从3月份开始各大互联网类、游戏类、软件类等公司开始招暑期实习,9月份正式招聘,面临众多的工作选择和技术方向,我们不免有些眼花缭乱啊 ... [详细]
author-avatar
怪兽朴朴朴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有