太厉害了终于有人能把TCPIP 协议讲的明明白白了.docx
- 文档编号:5484154
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:29
- 大小:756.33KB
太厉害了终于有人能把TCPIP 协议讲的明明白白了.docx
《太厉害了终于有人能把TCPIP 协议讲的明明白白了.docx》由会员分享,可在线阅读,更多相关《太厉害了终于有人能把TCPIP 协议讲的明明白白了.docx(29页珍藏版)》请在冰豆网上搜索。
太厉害了终于有人能把TCPIP协议讲的明明白白了
一图看完本文
一、计算机网络体系结构分层
计算机网络体系结构分层
计算机网络体系结构分层
不难看出,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就是互联网的协议。
网际协议群
2.数据包
包、帧、数据包、段、消息
以上五个术语都用来表述数据的单位,大致区分如下:
▪包可以说是全能性术语;
▪帧用于表示数据链路层中包的单位;
▪数据包是IP和UDP等网络层以上的分层中包的单位;
▪段则表示TCP数据流中的信息;
▪消息是指应用协议中数据的单位。
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。
通常,为协议提供的信息为包首部,所要发送的内容为数据。
在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
数据包首部
网络中传输的数据包由两部分组成:
一部分是协议所要用到的首部,另一部分是上一层传过来的数据。
首部的结构由协议的具体规范详细定义。
在数据包的首部,明确标明了协议应该如何读取数据。
反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。
包首部就像协议的脸。
3.数据处理流程
下图以用户a向用户b发送邮件为例子:
数据处理流程
▪①应用程序处理
▪首先应用程序会进行编码处理,这些编码相当于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根据端口号识别应用
一台计算机上同时可以运行多个程序。
传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
通过端口号识别应用
1.2通过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来触发。
下面来看看三次握手的流程图:
三次握手
▪第一次握手:
客户端将标志位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。
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
下面来看看四次挥手的流程图:
四次挥手
▪中断连接端可以是客户端,也可以是服务器端。
▪第一次挥手:
客户端发送一个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后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。
最终完成了四次握手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,
具体流程如下图:
同时挥手
3.3通过序列号与确认应答提高可靠性
▪在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。
这个消息叫做确认应答(ACK)。
当发送端将数据发出之后会等待对端的确认应答。
如果有确认应答,说明数据已经成功到达对端。
反之,则数据丢失的可能性很大。
▪在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。
由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
▪未收到确认应答并不意味着数据一定丢失。
也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。
这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
▪此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。
此时,源主机只要按照机制重发数据即可。
▪对于目标主机来说,反复收到相同的数据是不可取的。
为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。
为此我们引入了序列号。
▪序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。
接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。
通过序列号和确认应答号,TCP能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。
序列号和确认应答
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引入了窗口这个概念。
确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。
也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。
如下图所示:
▪
▪窗口控制
▪窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。
上图中窗口大小为4个段。
这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
3.7滑动窗口控制
滑动窗口
▪上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。
不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。
为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
▪在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。
当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
▪收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。
这样可以顺序地将多个段同时发送提高通信性能。
这种机制也别称为滑动窗口控制。
3.8窗口控制中的重发控制
在使用窗口控制中,出现丢包一般分为两种情况:
▪①确认应答未能返回的情况。
在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:
部分确认应答丢失
▪②某个报文段丢失的情况。
接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。
如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。
而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。
这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。
高速重发控制
四、网络层中的IP协议
▪IP(IPv4、IPv6)相当于OSI参考模型中的第3层——网络层。
网络层的主要作用是“实现终端节点之间的通信”。
这种终端节点之间的通信也叫“点对点通信”。
▪网络的下一层——数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。
而一旦跨越多种数据链路,就需要借助网络层。
网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
▪IP大致分为三大作用模块,它们是IP寻址、路由(最终节点为止的转发)以及IP分包与组包。
1.IP地址
1.1IP地址概述
▪在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。
在数据链路中的MAC地址正是用来标识同一个链路中不同计算机的一种识别码。
▪作为网络层的IP,也有这种地址信息,一般叫做IP地址。
IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。
因此,在TCP/IP通信中所有主机或路由器必须设定自己的IP地址。
▪不论一台主机与哪种数据链路连接,其IP地址的形式都保持不变。
▪IP地址(IPv4地址)由32位正整数来表示。
IP地址在计算机内部以二进制方式被处理。
然而,由于我们并不习惯于采用二进制方式,我们将32位的IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换成十进制数。
如下:
1.2IP地址由网络和主机两部分标识组成
▪如下图,网络标识在数据链路的每个段配置不同的值。
网络标识必须保证相互连接的每个段的地址不相重复。
而相同段内相连的主机必须有相同的网络地址。
IP地址的“主机标识”则不允许在同一个网段内重复出现。
由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。
即IP地址具有了唯一性。
IP地址的主机标识
▪如下图,IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。
因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。
IP地址的网络标识
1.3IP地址的分类
▪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.5IP多播
▪多播用于将包发送给特定组内的所有主机。
由于其直接使用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位是网络地址的情况为例,如下:
▪第二种表示方式是,在每个IP地址后面追加网络地址的位数用“/”隔开,如下:
2.路由
▪发送数据包时所使用的地址是网络层的地址,即IP地址。
然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。
保存这种信息的就是路由控制表。
▪该路由控制表的形成方式有两种:
一种是管理员手
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 太厉害了终于有人能把TCPIP 协议讲的明明白白了 厉害 终于 有人 TCPIP 协议 明明白白
![提示](https://static.bdocx.com/images/bang_tan.gif)