精华内容
下载资源
问答
  • TCP/IPTCP与UDP详解

    千次阅读 2018-08-26 21:14:30
    讲解TCP与UDP之前,...TCP/IP模型分为四层,分别是链路层、网络层、传输层、应用层,应用层以下的三层都是操作系统的内核中进行。  链路层:包括操作系统中的驱动程序和计算机网卡还有传输的物理介质,链路层...

    在讲解TCP与UDP之前,首先看一下它们在网络协议栈上的位置:

    所谓网络协议栈,就是对网络进行分层次的梳理,主要有OSI七层模型和ICP/IP的四层模型,对应关系如下图所示,主要介绍TCP/IP的四层模型:

    TCP/IP模型分为四层,分别是链路层、网络层、传输层、应用层,应用层以下的三层都是在操作系统的内核中进行。 

    • 链路层:包括操作系统中的驱动程序和计算机网卡还有传输的物理介质,链路层上面的主要协议有以太网协议;
    • 网络层:保证数据从一台主机将数据准确的发送到另一台指定的主机,主要通过指定IP地址(点分十进制)和端口号(表明应用程序)来实现,主要的协议有IP协议,ARP、RARP、ICMP和IGMP作为辅助协议。路由器属于网络层;
    • 传输层:网络层提供了一种不可靠的服务,它只是尽可能快把分组从源端口发送到目的窗口,但是并不能保证能毫发无损地准时送到。而传输层则利用TCP,UDP协议来保证传输。TCP采用超时重传,发送和接收端分组等机制来实现可靠传输。主要协议有TCP,UDP,TCP数据和UDP数据基本一致,唯一的区别是UDP传给IP的协议的信息单元称为UDP数据报;
    • 应用层:负责应用程序的具体需求,主要协议有FTP,TELNET,HTTP,HTML,STMP,POP,IMAP,DNS等。

    可见:TCP、UDP就是处于其中的传输层。各层之间的协议如下图所示:

     

    传输层

    既然有了IP协议(网络层),能将数据发送到指定的主机为什么还要由传输层。原因有两点:

    • IP协议提供的是不可靠的传输协议,它只是尽力将数据发送到目标主机,但是如果数据丢包,数据损坏,它都不能提供任何解决办法;
    • IP协议只是将数据发送到了目标主机,但是应该由哪个应用程序来接受这个数据包呢?IP协议没有办法告诉我们。

    因此传输层的作用就是为了实现以上两点目的。

    传输层协议有 TCP 协议和 UDP 协议。TCP 协议是面向有连接的协议,也就是说在使用 TCP 协议传输数据之前一定要在发送方和接收方之间建立连接。一般情况下建立连接需要三步,关闭连接需要四步。

    • TCP概述: TCP 协议是面向有连接的协议,还有数据重传、流量控制等功能,TCP 协议能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。然而 TCP 协议中定义了很多复杂的规范,因此效率不如 UDP 协议,不适合实时的视频和音频传输;
    • UDP概述: UDP 协议是面向无连接的协议,它只会把数据传递给接收端,但是不会关注接收端是否真的收到了数据。但是这种特性反而适合多播,实时的视频和音频传输。因为个别数据包的丢失并不会影响视频和音频的整体效果。

    IP 协议中的两大关键要素是源 IP 地址和目标 IP 地址。而刚刚我们说过,传输层的主要作用是实现应用程序之间的通信。因此传输层的协议中新增了两个要素:源端口号,目标端口号。再加上IP首部中的协议号,通过这五个信息,可以唯一识别一个通信。用一句话来概括就是:“源 IP 地址,目标 IP 地址,源端口号,目标端口号和协议号”这五个信息只要有一个不同,都被认为是不同的通信。

     

    端口号

    作用:用于区分同一台主机中正在通信的不同应用程序,因此也被称为程序地址。不同的端口用于区分同一台主机上不同的应用程序。假设你打开了两个浏览器,浏览器 A 发出的请求不会被浏览器 B 接收,这就是因为 A 和 B 具有不同的端口。端口号分为两种: 

    • 知名端口号:这种端口号是固定的,用于服务器程序,使用对应协议的程序就将端口号设为对应的数字。比如DNS的端口号就是53;
    • 动态端口号:这种端口号是不固定的,用于客户端程序,客户端程序对端口号要求不高,只要该端口号在本机中唯一就行。
    常见的知名端口号
    端口号 协议
    53 DNS
    80 HTTP
    20 FTP数据
    21 FTP控制
    23 SSH
    25 SMTP
    502 MODBUS

     

    TCP与UDP

    TCP与UDP都作为传输层的协议,必然是有所区别的。下表是关于TCP和UDP的区别:

    TCP和UDP的区别
    角度 TCP UDP
    是否连接

    面向连接(发送数据前需要建立连接)

    TCP在传输前先发送连接请求和应答包,确定双方能够

    正常传输后,才开始进行数据传输。

    无连接(发送数据无需连接)

    UDP在发送数据之前,并不考虑对方能否接受到,甚至目的地址可能都是无效

    是否丢包重试

    实现了数据传输时各种控制功能,可以进行丢包的重发

    控制,还可以对次序乱掉的分包进行顺序控制

    不会进行丢包重试,也不会纠正到达的顺序
    模式

    流模式(面向字节流)

    TCP把数据看成一连串无结构的字节流,没有边界,一

    段段传输构成了整个数据块。通过发送缓冲区和接受缓冲区来存储数据流。

    数据报模式(面向报文)

    UDP数据报模式,每一个数据报都是一个独立的对象,有着指定的大小。

    对应关系 一对一 支持一对一,一对多,多对一和多对多的交互通信
    头部开销 最小20字节 只有8字节
    可靠性 全双工非常可靠、无差错、不丢失、不重复、且按序到达 不保证可靠交付,不保证顺序到达
    拥塞控制 有控制 更多详情

    有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低

    (对实时应用很有用,如IP电话,实时视频会议等)

    资源要求 TCP程序结构较复杂,较多 UDP程序结构简单,少

    基于上表的区别,TCP与UDP具有不同的用途:

    TCP:用于实现可靠传输的情况,文件非常重要,对网络拥堵有较高要求的情况;

    UDP: 

    • 用于高速传输和实时性较高的场合(即时通信)。对于采用UDP的实时视频通信,如果出现丢包也只会出现短暂卡顿,但是如果采用TCP丢包后需要重发,会导致很长时间的卡顿;
    • 包总量较少的通信(DNS),客户端较多;
    • 广播通信。

     

    TCP与UDP的首部

    UDP首部

    • 源端口号:表示发送端端口号,不需要时设为0;
    • 目标端口号:表示接收端端口号;
    • 包长度:表示整个UDP包的长度;
    • 校验和:为了提供可靠的UDP首部和数据而设计,只要源IP地址,目标IP地址,源端口号,目标端口号,协议号有一个发生了篡改校验和都会不正确。

    TCP首部

    • 源端口号:发送端端口号;
    • 目标端口号:接受端端口号;
    • 序列号(Seq):发送数据时,表示发送数据的位置,发送完一次数据后,序列号的值都等于原来的序列号加上数据的长度;
    • 应答号(Ack):用于接受端告诉发送端下次应该从哪个位置开始发送,表示前面的数据已经都收到了,Ack = Seq + 1;
    • 数据偏移:实际就是TCP首部长度;
    • 保留:一般设置为0,用于后续扩展;
    • 控制位(标志位):长度为6,从左到右分别是URG,ACK,PSH,RST,SYN,FIN;
    • 窗口大小:能够发送数据的最大值,为0时可以发送探测窗口;
    • 校验和:与UDP校验和作用相同;
    • 紧急指针:用于处理紧急情况;
    • 选项:其他控制设置。

    常见的控制位(标志位)的含义:

    • URG:紧急指针(urgent pointer)有效,告诉接收TCP模块紧要指针域指着紧要数据;
    • ACK:确认序号有效;
    • PSH:接收方应该尽快将这个报文交给应用层,而不必等到缓冲区满时才传送;
    • RST:重置连接,如果接收到RST位时候,通常发生了某些错误;
    • SYN:建立一个新连接;
    • FIN:断开一个连接。

     

    如何实现可靠的UDP

    之前提到UDP是不可靠的,但是在一些使用UDP的环境中,又想保证其有一定的可靠性,那么怎么才能实现可靠的UDP呢?

    既然在传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

    也就是说,在应用层上实现确认机制、重传机制、窗口确认机制。如果你不利用Linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:

    • 数据完整性 –> 加上一个16或者32位的CRC验证字段
    • 乱序 –> 加上一个数据包序列号SEQ(编号)
    • 丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制

    比如:

    • 给数据包编号,按照包的顺序存储并发送; 
    • 接收端接收到数据包后检验验证字段和数据包编号,如果都正确,则发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包;如果接收端收到的数据包的编号不是期望的编号或者没有验证字段,则要求发送端重新发送。

    参考文章:怎样实现UDP可靠传输

    目前有如下开源程序利用udp实现了可靠的数据传输,分别为RUDP、RTP、UDT。

    • RUDP:RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为;
    • RTP:实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地;
    • UDT:基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。

    参考文章:udp如何实现可靠性传输?

     

    这边是有一份面试总结的链接:面试总结--网络

     

    展开全文
  • 太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    万次阅读 多人点赞 2020-05-07 09:30:15
    OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“计算机上实现协议应该开发哪种程序”。 二、 TCP/IP 基础 1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为...

     

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    一图看完本文

     

    一、 计算机网络体系结构分层

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    计算机网络体系结构分层

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    计算机网络体系结构分层

    不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。

     

    二、 TCP/IP 基础

    1. TCP/IP 的具体含义

    从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。

    互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    网际协议群

    2. 数据包

    包、帧、数据包、段、消息

    以上五个术语都用来表述数据的单位,大致区分如下:

    • 包可以说是全能性术语;
    • 帧用于表示数据链路层中包的单位;
    • 数据包是 IP 和 UDP 等网络层以上的分层中包的单位;
    • 段则表示 TCP 数据流中的信息;
    • 消息是指应用协议中数据的单位。

    每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    数据包首部

    网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。

    3. 数据处理流程

    下图以用户 a 向用户 b 发送邮件为例子:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    数据处理流程

    • ① 应用程序处理
    • 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
    • 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
    • ② TCP 模块的处理
    • TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
    • ③ IP 模块的处理
    • IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
    • ④ 网络接口(以太网驱动)的处理
    • 从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
    • ⑤ 网络接口(以太网驱动)的处理
    • 主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。
    • 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
    • ⑥ IP 模块的处理
    • IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
    • 另外吗,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
    • ⑦ TCP 模块的处理
    • 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
    • ⑧ 应用程序的处理
    • 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。

     

    三、传输层中的 TCP 和 UDP

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。

    • TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
    • UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
    • TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。

    1. 端口号

    数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

    1.1 根据端口号识别应用

    一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    通过端口号识别应用

    1.2 通过 IP 地址、端口号、协议号进行通信识别

    • 仅凭目标端口号识别某一个通信是远远不够的。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    通过端口号、IP地址、协议号进行通信识别

    • ① 和② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。
    • ③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。
    • 此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。

    1.3 端口号的确定

    • 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
    • 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。

    1.4 端口号与协议

    • 端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。
    • 此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。

    2. UDP

    • UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
    • 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
    • 此外,传输途中出现丢包,UDP 也不负责重发。
    • 甚至当包的到达顺序出现乱序时也没有纠正的功能。
    • 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。
    • UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。

    3. TCP

    • TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
    • 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
    • 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。

    3.1 三次握手(重点)

    • TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
    • 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

    下面来看看三次握手的流程图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    三次握手

    • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
    • 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
    • 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

    3.2 四次挥手(重点)

    • 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
    • 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

    下面来看看四次挥手的流程图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    四次挥手

    • 中断连接端可以是客户端,也可以是服务器端。
    • 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
    • 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
    • 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
    • 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

    上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,

    具体流程如下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    同时挥手

    3.3 通过序列号与确认应答提高可靠性

    • 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大
    • 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
    • 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
    • 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。
    • 对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。
    • 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    序列号和确认应答

    3.4 重发超时的确定

    • 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”。
    • TCP 要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值。
    • 在 BSD 的 Unix 以及 Windows 系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右。
    • 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
    • 此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

    3.5 以段为单位发送数据

    • 在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。
    • TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以 MSS 为单位。
    • MSS 在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。然后会在两者之间选择一个较小的值投入使用。

    3.6 利用窗口控制提高速度

    • TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
    • 为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    •  
    • 窗口控制
    • 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。

    3.7 滑动窗口控制

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    滑动窗口

    • 上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
    • 在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
    • 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。

    3.8 窗口控制中的重发控制

    在使用窗口控制中, 出现丢包一般分为两种情况:

    • ① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    部分确认应答丢失

    • ② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    高速重发控制

     

    四、网络层中的 IP 协议

    • IP(IPv4、IPv6)相当于 OSI 参考模型中的第3层——网络层。网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。
    • 网络的下一层——数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
    • IP 大致分为三大作用模块,它们是 IP 寻址、路由(最终节点为止的转发)以及 IP 分包与组包。

    1. IP 地址

    1.1 IP 地址概述

    • 在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。在数据链路中的 MAC 地址正是用来标识同一个链路中不同计算机的一种识别码。
    • 作为网络层的 IP ,也有这种地址信息,一般叫做 IP 地址。IP 地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。因此,在 TCP/IP 通信中所有主机或路由器必须设定自己的 IP 地址。
    • 不论一台主机与哪种数据链路连接,其 IP 地址的形式都保持不变。
    • IP 地址(IPv4 地址)由32位正整数来表示。IP 地址在计算机内部以二进制方式被处理。然而,由于我们并不习惯于采用二进制方式,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数。如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    1.2 IP 地址由网络和主机两部分标识组成

    • 如下图,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP 地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠。即 IP 地址具有了唯一性。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    IP地址的主机标识

    • 如下图,IP 包被转发到途中某个路由器时,正是利用目标 IP 地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    IP地址的网络标识

    1.3 IP 地址的分类

    • IP 地址分为四个级别,分别为A类、B类、C类、D类。它根据 IP 地址中从第 1 位到第 4 位的比特列对其网络标识和主机标识进行区分。
    • A 类 IP 地址是首位以 “0” 开头的地址。从第 1 位到第 8 位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。
    • B 类 IP 地址是前两位 “10” 的地址。从第 1 位到第 16 位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0 是 B 类的网络地址。B 类地址的后 16 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。
    • C 类 IP 地址是前三位为 “110” 的地址。从第 1 位到第 24 位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个。
    • D 类 IP 地址是前四位为 “1110” 的地址。从第 1 位到第 32 位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255 是 D 类的网络地址。D 类地址没有主机标识,常用于多播。
    • 在分配 IP 地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用。而全部为 1 的主机通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么 C 类地址每个网段最多只能有 254( 28 - 2 = 254)个主机地址的原因。

    1.4 广播地址

    • 广播地址用于在同一个链路中相互连接的主机之间发送数据包。将 IP 地址中的主机地址部分全部设置为 1,就成了广播地址。
    • 广播分为本地广播和直接广播两种。在本网络内的广播叫做本地广播;在不同网络之间的广播叫做直接广播。

    1.5 IP 多播

    • 多播用于将包发送给特定组内的所有主机。由于其直接使用 IP 地址,因此也不存在可靠传输。
    • 相比于广播,多播既可以穿透路由器,又可以实现只给那些必要的组发送数据包。请看下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    •  
    • IP 多播
    • 多播使用 D 类地址。因此,如果从首位开始到第 4 位是 “1110”,就可以认为是多播地址。而剩下的 28 位可以成为多播的组编号。
    • 此外, 对于多播,所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组,所有的路由器必须属于 224.0.0.2 的组。

    1.6 子网掩码

    • 现在一个 IP 地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比 A 类、B 类、C 类更小粒度的网络。这种方式实际上就是将原来 A 类、B 类、C 类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
    • 子网掩码用二进制方式表示的话,也是一个 32 位的数字。它对应 IP 地址网络标识部分的位全部为 “1”,对应 IP 地址主机标识的部分则全部为 “0”。由此,一个 IP 地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是 IP 地址的首位开始连续的 “1”。
    • 对于子网掩码,目前有两种表示方式。第一种是,将 IP 地址与子网掩码的地址分别用两行来表示。以 172.20.100.52 的前 26 位是网络地址的情况为例,如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    • 第二种表示方式是,在每个 IP 地址后面追加网络地址的位数用 “/ ” 隔开,如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    2. 路由

    • 发送数据包时所使用的地址是网络层的地址,即 IP 地址。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表。
    • 该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新。前者也叫做静态路由控制,而后者叫做动态路由控制。
    • IP 协议始终认为路由表是正确的。然后,IP 本身并没有定义制作路由控制表的协议。即 IP 没有制作路由控制表的机制。该表示由一个叫做“路由协议”的协议制作而成。

    2.1 IP 地址与路由控制

    • IP 地址的网络地址部分用于进行路由控制。
    • 路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
    • 在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    路由控制表与 IP 包发送

    3. IP 分包与组包

    • 每种数据链路的最大传输单元(MTU)都不尽相同,因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
    • 任何一台主机都有必要对 IP 分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
    • 经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。

    3.1 路径 MTU 发现

    • 分片机制也有它的不足。如路由器的处理负荷加重之类。因此,只要允许,是不希望由路由器进行 IP 数据包的分片处理的。
    • 为了应对分片机制的不足,“路径 MTU 发现” 技术应运而生。路径 MTU 指的是,从发送端主机到接收端主机之间不需要分片是最大 MTU 的大小。即路径中存在的所有数据链路中最小的 MTU 。
    • 进行路径 MTU 发现,就可以避免在中途的路由器上进行分片处理,也可以在 TCP 中发送更大的包。

    4. IPv6

    • IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。

    4.1 IPv6 的特点

    • IP 得知的扩大与路由控制表的聚合。
    • 性能提升。包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
    • 支持即插即用功能。即使没有DHCP服务器也可以实现自动分配 IP 地址。
    • 采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
    • 多播、Mobile IP 成为扩展功能。

    4.2 IPv6 中 IP 地址的标记方法

    • 一般人们将 128 比特 IP 地址以每 16 比特为一组,每组用冒号(“:”)隔开进行标记。
    • 而且如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号(“::”)隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。

    4.3 IPv6 地址的结构

    • IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。
    • 在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配 IP 地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    4.4 全局单播地址

    • 全局单播地址是指世界上唯一的一个地址。它是互联网通信以及各个域内部通信中最为常用的一个 IPv6 地址。
    • 格式如下图所示,现在 IPv6 的网络中所使用的格式为,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特为网络标识,后 64 比特为主机标识。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    全局单播地址

    4.5 链路本地单播地址

    • 链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    链路本地单播地址

    4.6 唯一本地地址

    • 唯一本地地址是不进行互联网通信时所用的地址。
    • 唯一本地地址虽然不会与互联网连接,但是也会尽可能地随机生成一个唯一的全局 ID。
    • L 通常被置为 1
    • 全局 ID 的值随机决定
    • 子网 ID 是指该域子网地址
    • 接口 ID 即为接口的 ID

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    唯一本地地址

    4.7 IPv6 分段处理

    • IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。
    • IPv6 中最小 MTU 为 1280 字节,因此,在嵌入式系统中对于那些有一定系统资源限制的设备来说,不需要进行“路径 MTU 发现”,而是在发送 IP 包时直接以 1280 字节为单位分片送出。

    4.8 IP 首部(暂略)

    5. IP 协议相关技术

    • IP 旨在让最终目标主机收到数据包,但是在这一过程中仅仅有 IP 是无法实现通信的。必须还有能够解析主机名称和 MAC 地址的功能,以及数据包在发送过程中异常情况处理的功能。

    5.1 DNS

    • 我们平常在访问某个网站时不适用 IP 地址,而是用一串由罗马字和点号组成的字符串。而一般用户在使用 TCP/IP 进行通信时也不使用 IP 地址。能够这样做是因为有了 DNS (Domain Name System)功能的支持。DNS 可以将那串字符串自动转换为具体的 IP 地址。
    • 这种 DNS 不仅适用于 IPv4,还适用于 IPv6。

    5.2 ARP

    • 只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个 IP 地址所对应的 MAC 地址。
    • ARP 是一种解决地址问题的协议。以目标 IP 地址为线索,用来定位下一个应该接收数据分包的网络设备对应的 MAC 地址。不过 ARP 只适用于 IPv4,不能用于 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息。
    • RARP 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议。

    5.3 ICMP

    • ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。
    • IPv4 中 ICMP 仅作为一个辅助作用支持 IPv4。也就是说,在 IPv4 时期,即使没有 ICMP,仍然可以实现 IP 通信。然而,在 IPv6 中,ICMP 的作用被扩大,如果没有 ICMPv6,IPv6 就无法进行正常通信。

    5.4 DHCP

    • 如果逐一为每一台主机设置 IP 地址会是非常繁琐的事情。特别是在移动使用笔记本电脑、只能终端以及平板电脑等设备时,每移动到一个新的地方,都要重新设置 IP 地址。
    • 于是,为了实现自动设置 IP 地址、统一管理 IP 地址分配,就产生了 DHCP(Dynamic Host Configuration Protocol)协议。有了 DHCP,计算机只要连接到网络,就可以进行 TCP/IP 通信。也就是说,DHCP 让即插即用变得可能。
    • DHCP 不仅在 IPv4 中,在 IPv6 中也可以使用。

    5.5 NAT

    • NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。
    • 除转换 IP 地址外,还出现了可以转换 TCP、UDP 端口号的 NAPT(Network Address Ports Translator)技术,由此可以实现用一个全局 IP 地址与多个主机的通信。
    • NAT(NAPT)实际上是为正在面临地址枯竭的 IPv4 而开发的技术。不过,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 之间的相互通信当中常常使用 NAT-PT。

    5.6 IP 隧道

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    夹着 IPv4 网络的两个 IPv6 网络

    • 如上图的网络环境中,网络 A 与网络 B 之间无法直接进行通信,为了让它们之间正常通信,这时必须得采用 IP 隧道的功能。
    • IP 隧道可以将那些从网络 A 发过来的 IPv6 的包统合为一个数据,再为之追加一个 IPv4 的首部以后转发给网络 C。
    • 一般情况下,紧接着 IP 首部的是 TCP 或 UDP 的首部。然而,现在的应用当中“ IP 首部的后面还是 IP 首部”或者“ IP 首部的后面是 IPv6 的首部”等情况与日俱增。这种在网络层的首部后面追加网络层首部的通信方法就叫做“ IP 隧道”。

     

    作者:涤生_Woo

    链接:https://www.jianshu.com/p/9f3e879a4c9c

     

    展开全文
  • TCP/IPTCP协议

    千次阅读 2015-04-02 19:47:29
    TCPTCP/IP体系结构中最主要的传输层协议,它只提供面向连接的传输服务。 TCP具备一下特性: 1、面向连接的传输协议。应用程序使用TCP之前,必须先建立TCP传输连接,传输数据完毕后,必须释放已建立的TCP传输...

    TCP是TCP/IP体系结构中最主要的传输层协议,它只提供面向连接的传输服务。

    TCP具备一下特性:

    1、面向连接的传输协议。应用程序在使用TCP之前,必须先建立TCP传输连接,在传输数据完毕后,必须释放已建立的TCP传输连接。

    2、仅支持单播传输。每条TCP传输连接只能有两个端点(socket),只能进行点对点的数据传输。

    3、提供可靠的传输服务。通过TCP连接传送的数据可以无差错。不丢失、不重复。且按时序到达对端。

    4、支持全双工服务。TCP允许通信双方的应用程序在任何时候都能发送数据,TCP连接的两端都设有发送和缓存,用于临时存放双向通信的数据。

    5、每次发送的TCP数据段大小和数据段数都是可变的。在TCP中,每次发送多少字节的数据是根据对方给出的窗口大小和当前网络的拥塞程度来决定的。


    二、TCP数据段格式

    TCP通过数据段的交互来建立连接、传输数据、发出确认、进行差错控制、流量控制及关闭连接。整个TCP数据段也分为“数据段头”和“数据”两部分,数据段头即为TCP为了实现端到端可靠传输而加上的TCP控制信息,数据部分则是指高层(TCP/IP体系结构中的“应用层”)来的用户数据。

    下面给出TCP数据段格式及各字段说明:

                         

    1. 源端口号和目标端口号,分别代表发送方和接收方的TCP端口号,各占16位,一个端口与其主机的IP地址就可以完整地标识一个端点了,即我们常说的套接字(Socket)
    2. 序列号,即TCP数据段中的数据部分(不含数据段头)的第一个字节的编号,占32位,在一个TCP连接中,传送的数据字节流中每一个数据字节都要按顺序进行编号,在数据段头中标识的只是每个数据段的第一个数据字节的编号,整个要传送的字节流的起始序号必须在连接建立时设置。
    3. 确认号,指期望接收到对方下一个数据段中数据部分的第一个字节序号,占32位,确认号不是代表已经正确接收到的最后一个字节的序号。而是期望接收到的。比如主机B已接收到A机发来的长度为100个字节的序列号为101的数据段,表明主机B已经接收到了主机A的前200个字节,那么下一步期望接收到的数据段的第一个字节序号应为201,于是主机B在给A机发送确认数据段时要把确认号设置为201。序列号和确认号两个字段共同用于TCP服务中的差错控制。
    4. 首部长度,指数据段中的数据部分起始处距离TCP数据段起始处的字节偏移量,占4位。即确定TCP数据段头部分的长度。
    5. 保留
    6. URG(Urgent Pointer),紧急指针控制位,指TCP数据段中确认号字段是否有效,占1位,置位表示有紧急数据,会被优先安排传送
    7. ACK,确认控制位,指示TCP数据段中的确认号字段是否有效,占1位,仅当ACK置位时才表示确认号字段有效,否则无效,应用层实体在读取数据时可以不管确认号字段
    8. PSH,推控制位,指示是否需要立即把收到的该数据段提交给应用进程,占1位,当PSH置位时,要求接收端尽快把该数据段提交给应用进程,置0则没这个要求,可以先缓存起来。
    9. RST,重置控制位,用于重置、释放一个已经混乱的传输连接,然后重建新的传输连接,占1位,置位开始运作
    10. SYN,同步控制位,用来在传输连接建立时同步传输连接序号,占1位,当SYN置位时,表示这是一个连接请求或连接确认报文,关于该字段与ACK字段的配合使用,请参见TCP三次握手和四次挥手
    11. FIN,最后控制位,用于释放一个传输连接,占1位,当置位时,表示数据已全部传输完成,发送端没有数据要传输了,要求释放当前连接,但是接收端仍可以继续接受没有接收完成的数据。
    12. 窗口大小,指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,即发送者当前还可以接收的最大字节数,占16位
    13. 校验和,是对数据段头、数据和伪头部这三部分进行校验,占16位,伪头部包括源主机和目的主机的32位IP地址、TCP协议号(6),以及TCP数据段长度
    14. 紧急指针,仅当前面的URG控制位置位才有意义,指出本数据段中为紧急数据的字节数,占16位。紧急数据无需缓存,所以即使窗口大小为0,也是可以发送的
    15. 可选项,如果没有使用该字段,那么TCP的头部大小为20字节
    16. 数据,这是由应用层的应用进程提交的数据,作为TCP数据段的数据(有效载荷)部分。

    三、套接字(Socket)
    在TCP/IP通信中,应用程序把数据传送给Socket,然后由Socket通过传输层向下提交给网络驱动程序并向网络上发送出去。计算机从网络上收到与该Socket绑定的IP地址和端口号相关的数据后,由网络驱动程序通过传输层向上提交给应用层的Socket,最后应用程序从Socket中提取所要接受的数据。通信双方计算机上的网络应用程序就是这样通过Socket进行数据的发送与接收的。

    关于Socket的进一步介绍,参见博文:
    TCP的建立连接和释放连接过程:TCP三次握手和四次挥手TCP状态转换图详解

    四、TCP的可靠传输

    在TCP可靠传输方面,主要采用以下4中机制:

    1. 字节编号机制,TCP数据段以字节为单位对数据段中的数据部分进行一一编号,确保每个字节的数据都可以有序传送和接收
    2. 数据段确认机制,TCP要求每接收一个数据段都必须由接收端向发送端返回一个确认数据段(可以用一个确认数据段一次确认前面多个数据段),其中的确认号表明了接收端已正确接收的数据段序号
    3. 超时重传机制,在TCP中有一个重传定时器(RTT),在发送一个数据段的同时也启动了该定时器,如果在定时器过期之前该数据段还没有被对方确认的话,则定时器停止,然后重传对应序号的数据段
    4. 选择性确认机制,仅可以重传缺少部分的数据,而不会重传那些已正确接收的数据
    咦,这个选择性确认机制似曾相识啊,没错,在我们前面学习的数据链路层中,传输的差错纠正中的选择重发策略(差错纠正的第2点)也是这个机制。


    五、TCP的流量控制和拥塞控制

    流量控制是基于通信双方的数据发送和接收速率匹配方面考虑的,其最终目的就是不要让数据发送的太快,以便接收端能够来得及接收,是一个链路两端的点对点行为。

    TCP的流量控制是采用滑动窗口协议来进行的。TCP数据段是以字节为单位进行编号的,但由于一个数据段只有一个TCP头部,所以TCP是以数据段为单位进行传输的,接收端通过TCP头部来识别所接收的数据属于哪个数据段。一个数据段只要没有完全接收(FIN),接收端就不会认为已接收了该数据段。就像我们通过QQ等工具传输文件,只有还有部分没接收玩,则计算机就不会认为该文件已正确接收,即使已有了文件名,也打不开已接收的部分。


    网络拥塞就是,网络中各个部分输入的流量大于输出的流量时就会出现网络拥塞,类似于高速公路上的“堵死”。当然,出现网络拥塞也不止上面这种情况,比如TCP链接的整个链路中有结点设备的缓存空间太小、数据转发能力太低,某段链路带宽太小等


    关于流量控制策略和拥塞控制策略,这里不介绍了。

    展开全文
  • TCP/IP学习(二)IPTCP、UDP协议

    千次阅读 2012-06-06 21:46:25
    这里只是简单说明下IPTCP、UDP数据报报头和各个字段的简单意义,像IP选路、TCP链接的建立和终止等复杂的问题,以后做总结。首先是大概介绍下各个协议,然后分别的说明协议报头。 1.IP提供一种不可靠、无连接...

    一、概述

    在这里只是简单说明下IP、TCP、UDP数据报报头和各个字段的简单意义,像IP选路、TCP链接的建立和终止等复杂的问题,以后在做总结。首先是大概介绍下各个协议,然后分别的说明协议报头。

    1.IP提供一种不可靠、无连接的数据报传送服务。

    不可靠:不能保证IP数据报能够成功的到达目的地,如果发生某种错误,如路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃数据报,然后发送ICMP消息报告给信源端。任何要求的可靠性必须由上层来提供。
    无连接:IP并不维护任何关于后续数据报的状态信息(下一个数据报的目的IP,下一个的大小等),每个数据报处理都是独立的。所以IP数据报可以不按照发送顺序接收。

    2.UDP

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。

    3.TCP

    TCP提供一种面向连接的、可靠的字节流服务。
    面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP中,仅有两方进行彼此通信,广播和多播不能用于TCP。
    TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端的检验和。

    二、IP首部

    IP的首部如下图所示,如果没有选项字段,普通的IP首部有20个字节。

    下面是用wireshark软件分析的一个IP数据报的截图,对应的显示了个个部分。


    版本号有四位,现在有4和6两个版本。
    首部长度用一个四比特的字段来表示,最长为60个字节(四个字节对齐,所以最大不是63)。
    8位的服务(TOS)字段包括一个3bit优先权字段(现在已经被忽略),4bit的TOS字段,和1bit未用位但是必须置为0。4bit的TOS分别代表最小延时,最大吞吐量,最高可靠性和最小费用。大多数的TCP/IP都不支持TOS特性了。
    16位总长度是整个IP数据报的长度,以字节为单位,利用首部长度字段和总长度字段就可以知道IP数据报的数据内容的起始位置和长度。16位最大为65535,当IP数据报分片时,这个字段要改变的。
    下面的16位为标识字段,标识字段唯一标识发送的每一份数据报,通常每发送一份报文,它的值就会加1,它在分片重组的时候会用到。3位的标识字段和13为的偏移字段也是与分片有关,以后会在讨论。
    TTL设置了数据报可以经过的最多路由器数目,初始值由主机设置,每经过一个路由器处理,它的值就会减1,当该字段为0时会被丢弃,并发送ICMP报文通知源主机。
    16位的首部检验字段是根据IP的首部计算校验和码,它不对首部后面的数据进行计算。
    剩下的八个字节分别是四个字节的源IP地址和目的地址。
    任选项是一个数据报中一个可变长的可选信息,有几个例如记录路径:让每个路由器记下它的IP地址,时间戳:记下IP地址的时间。和一些其它的定义。

    三、UDP首部

    下面是UDP的首部,比较简单。

    其中UDP的校验和覆盖UDP首部和UDP数据,UDP和TCP都有覆盖首部和数据的校验和,但是UDP的校验和是可选的,而TCP的校验和是必须的。可能上面的两点都是为了加快UDP的传输速度。如果发送端没有计算校验和而接收端检测到校验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文,尽管UDP校验和是可选的,但是一般都是使用的。

    四、TCP首部

    下面是TCP首部和wireshark的TCP包分析结果

     

    其中32位的序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号来对每个字节进行计算,序号是32位的无符号数,到达2的32次方减一后从0开始。
    既然每个字节都被计数,那么确认序号包含发送确认的一端所期望收到的下一个序号,因此确认序号应该是上次已经成功收到数据字节序号加1,只有ACK字段为1时候,确认序号字段才有效。TCP为应用提供全双工的服务,这意味着数据能在两个方向上独立的传输,因此链接的每一端都必须保持每个方向上的传输数据序号。
    TCP的六个标识字段分别为:
    URG 紧急指针有效(urgent pointer)
    ACK 确认序号有效
    PSH 接收方应尽快将报文段交给应用层
    RST 重建链接
    SYN 同步序号用来发起一个连接。
    FIN 发端完成发送任务
    16位的校验和覆盖了整个TCP报文段:TCP首部和TCP数据,这是一个强制性的字段,一定由发端计算和存储,并由收端进行验证。

     

    四、以太网帧格式

    6个字节的目的地址,6个字节的源地址,2个字节的类型,然后就是(46~1500)字节的数据,最后有4个字节的CRC循环校验码。其中类型有三种IP数据报,ARP的请求/应答,RARP的请求/应答。

     

    展开全文
  • TCP/IP协议详解(TCP/IP protocol)

    千次阅读 2017-09-06 19:21:51
    本文转载自菜鸟教程TCP/IP 教程TCPIP 教程 TCPIP 介绍 计算机通信协议Computer Communication Protocol 什么是 TCPIP TCPIP 内部 TCP 使用固定的连接 IP 是无连接的 IP 路由器 TCPIP TCPIP 寻址 IP地址 IP 地址...
  • TCP/IP协议以及TCP状态机

    万次阅读 2014-03-06 20:17:42
    TCP/IP协议以及TCP状态机   1 TCP/IP 1.1 概述 TCP/IP协议族(TCP/IP ...由于网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈(TCP/IP Pr
  • TCP/IP协议

    千次阅读 2019-11-08 22:55:37
    TCP/IP协议 TCP/IP: TCP/IP的全称为...TCP/IP协议从名字上面看是指TCP协议和IP协议,但是实际上不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TC...
  • IPTCP有什么区别

    千次阅读 2009-12-28 18:48:00
    什么是 TCP/IPTCP/IP 是供已连接因特网的计算机进行通信的通信协议。... TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何它们之间传输的标准。 TCP/IP协议介绍 TCP/IP的通讯协议
  • HTTP协议、TCP协议、IP协议和TCP/IP协议区别

    万次阅读 多人点赞 2017-05-02 17:31:20
    TCP/IP协议TCP/IP协议在上一篇文章中网络协议详解我已经很详细的讲解了.所以这一篇中,我简单说一下如果想要详细了解,请参考上篇文章. TCP/IP协议看上去好像是TCP协议和IP协议,但其实并不一样 TCP/IP协议叫做网络...
  • tcp/ip系列--tcp/ip基础知识

    千次阅读 2018-10-30 19:35:00
    最近读完了《图解TCP/IP》,做一下总结加深记忆,后续会写几篇关于TCP/IP的文章。 一.网络基础知识 1.1计算机与网络发展的7个阶段 批处理:指事先将用户程序和数据装入卡带或磁带,并由计算机按照一定的顺序读取,...
  • IPTCP、UDP数据包长度问题

    千次阅读 2017-11-29 00:10:10
    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。  其中以太网(Ethernet)的数据帧链路层 IP网络层  TCP或UDP包传输层 TCP或UDP中的数据(Data)应用层 它们的关系是 数据...
  • TCP/IP 由军用网络发展而来,后续逐渐连接了四所大学或研究所,形成了ARPANET,成为互联网的鼻祖,ARPANET的一个研究机构中研发了TCP/IP。并逐步成为最常用的以太网通信协议。 TCP/IP协议 TCP/IP 协议不仅包括TCP...
  • 网络基础知识 TCP UDP IP

    千次阅读 多人点赞 2020-08-24 09:15:19
    TCP/IP是一组协议的代名词,它包括了许多承载在IP或者TCP之间或之上的协议,由这些协议统一组成了TCP/IP协议簇。TCP/IP协议簇是Internet最基本的协议和最重要也是最主要的组成。 2、组成 (1)应用层协议:HTTP,...
  • TCP/IP】图解TCP的通信机制

    千次阅读 多人点赞 2020-11-04 09:24:33
    TCP的英文全称就知道,其主要作用就是传输 、控制,传输的是数据,控制的是传输过程中丢包后的重发 、分包乱序后的有序重组 、控制数据传输的速率防止网络拥塞等 这也是我们口中一直说的TCP是一种可靠的传输协议...
  • ip tcp intercept

    千次阅读 2013-02-05 17:32:57
    SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,...
  • TCP/IP详解--TCP/IP工作流程

    千次阅读 2014-03-29 20:41:04
    Intemet采用TCP/IP协议... TCP/IP模型有四层(应用层、传输层、网际层、网络接口层),每层分别具有不同的协议和功能,TCP/IP协议族是一组不同层上的多个协议的组合。各层实现自身的功能时,使用它的直接下层提供的
  • tcp/ip

    千次阅读 2015-09-17 17:22:17
     TCP/IP是供已连接因特网的计算机进行通信的通信协议。 TCP/IP指传输控制协议/网际协议(Transmission Control Protocol/...在TCP/IP内中包含一系列用于处理数据通信的协议: TCP(传输控制协议)-应用程序之
  • TCP/IPtcp快速重传和快速恢复

    千次阅读 2017-02-05 19:42:18
    2.《tcp/ip 协议》描述的快速恢复有点乱。简单来讲,就是快速重传后执行拥塞避免算法,而不是慢启动算法。通过控制慢启动窗口ssthresh和拥塞窗口cwnd的值就可以实现。具体如下 (1)接收方发送第1次数据确认ACK。...
  • DPDK 使用网卡ip/tcp/udp checksum offload

    千次阅读 2017-07-07 10:41:13
    网卡ip/tcp/udp checksum offload的功能就是将报文的iptcp, udp校验和的计算交给网卡计算,节省cpu的消耗。 第一步 初始化网卡时打开网卡的checksum offload功能 .hw_ip_checksum = 1, /** 调用rte_eth_...
  • TCP/IP简介

    千次阅读 2019-01-09 20:54:02
    TCP/IP四层协议模型如下: TCP/IP是互联网(Internet)的通信协议,是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信!...在TCP/IP协议族中包含一系列用于处理数据通信的协议: ...
  • 基于TCP/IP的四层协议的信息封装如下所示: 红色:以太网报文段头部 紫色:IP报文段头部 红色:TCP报文段头部 以太网报文段头部 以太网链路上的数据包称作以太帧。以太帧起始部分由前导码和帧开始符组成。...
  • 以太网,IP,TCP,UDP数据包分析

    千次阅读 2016-10-25 16:15:20
    1、ISO开放系统有以下几层:7应用层6表示层5会话层4传输层3网络层2数据链路层1物理层2、TCP/IP 网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。通信过程中,每...
  • TCP/IPTCP的三次握手和四次挥手

    千次阅读 2014-10-04 14:20:13
    如果 A机向 B机发送“hello”,物理网线上传输的数据不仅仅是“hello”这5个字符,其实除了hello(被称为有效载荷)之外,还必须有用于TCP/IP协议进行处理所需要的其他很多内容。这其中与socket 编程相关的最主要...
  • 1. TCP/IP 分别模型的哪一层? TCP 传输层(运输层); IP 网络层(互联网层)。 参考文献: 《计算机网络(第 5 版)》 - Tanenbaum - 1.4 参考模型 - 1.4.1 OSI 参考模型 & 1.4.2 TCP/IP ...
  • TCP/IPIP地址分类和特殊IP地址

    万次阅读 多人点赞 2018-07-12 19:14:10
    IP地址是因特网技术中的一个非常重要的概念,IP地址在IP层实现了底层网络地址的统一,使因特网的网络层地址具有全局唯一性和一致性。IP地址含有位置信息,反映了主机的网络连接,使因特网进行寻址和路由选择的依据。...
  • TCP/IPIP地址的划分及其分类

    万次阅读 多人点赞 2020-10-19 09:16:12
    每个设备都至少需要一个IP地址,其可以作为我们设备的标识,就跟我们的电话号码一样,知道了电话号码就能找到我们,所以每个IP地址都是唯一的,所以给每台设备分配IP时,会根据一套编号方案进行。 IP作用于OSI参考...
  • IP 网络层 TCP/UDP 传输层 HTTP、RTSP、FTP 应用层协议

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,189
精华内容 26,475
关键字:

ip在tcp