热门标签 | 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拥塞窗口变化的原则是加法增大、乘法减小。

 


推荐阅读
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
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社区 版权所有