TCP/IP协议族全析
TCP/IP协议族
计算机与网络设备要相互通信,双方就必须基于相同的方法。如何探测到通信目标、由那一边现发起通信、使用哪种语言、使用那种操作系统、怎样结束通信等都需要事先确定。不同的硬件、操作系统之间的相互通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议。而与互联网相关联的协议集合起来总称为TCP/IP协议族。
图:TCP/IP是互联网各类协议族的总称TCP/IP的分层管理
TCP/IP协议族里最重要的一点就是分层。TCP/IP协议族暗层次可以氛围以下五层:应用层、传输层、网络层、数据链路层、实体层。
图:TCP/IP的分层把TCP/IP层次化的好处有很多。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分成之后只需把改变的曾替换掉即可。八个层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。
实体层
实体层就是把电脑连接起来的物理手段,它主要规定了网络的一些电气特性。
链接层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
1.以太网协议
早起的时候,每家公司都有自己的电信号分组方式。逐渐的,一种叫做以太网的协议,占据了主导地位。
以太网协议规定,一组电信号构成一个数据包,叫做桢(frame)。每一帧分成两个部分:标头(Head)和数据(Data)。“标头”包含数据的一些说明项,比如发送者、接受者、数据类型等;“数据”则是发送的具体内容。
图:数据包2.MAC地址
以太网规定,如网设备,必须有网卡接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址就是数据包的发送地址和接收地址,被称为MAC地址。
3.广播
如何从一块网卡获知另一块网卡地址,首先采用的是一种ARP协议(Address Resolution Protocol)获取对应的MAC地址,然后以太网采用了一种很原始的方式,向所有的本网内所有计算机发送,让每台计算机自己判断对应的MAC地址是否与自己一样,如果一样,就接受这个包,做进一步处理,负责就丢弃这个包。这种发送方式就叫做广播(Broadcasting)。
在同一局域网内,PC1发送的数据包以广播的形式进行发送,当匹配对象PC2接收到请求之后,就可以将PC1的IP和MAC映射信息存储在本地的【ARP缓存表】,既然知道PC1在哪里,就可以返回ARP单播回应包。
网络层
互联网是无数个子网络共同组成的一个巨型网络,如果在同一个子网络,就采用广播的方式发送,否则就采用路由方式发送。这就导致了网络层的诞生。他的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。
网络层用来处理在网络上流动的数据包。数据包是网络层传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据传送给对方。
1.IP协议
IP协议的作用是把各种数据包传送给对方。而要确保数据确实发送到对方哪里,则需要满足各类条件。其中最主要的条件是IP地址和MAC地址。IP地址指明了节点被分配到的地址,MAC是网卡所属的固定地址。 IP地址可更换,但MAC地址基本上不会更改。
互联网上的每一台计算机,都会分配一个IP地址。这个地址分为两部分,前一部分代表网络,后一部分代表主机。判断两台计算机是否属于同一个子网络,需要用到另一个参数子网掩码,它是一个32位地址,它只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分,如果两台电脑的网络地址部分相同,则可以判定他们在同一个子网络。
2.ARP协议
IP间的通信依赖MAC地址。在网络上,通信双方不在同一局域网内,事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。而在同一局域网内,我们可以使用ARP协议(Address Resolution Protocol),获取对方的MAC地址。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查处对应的MAC地址。
3.IMCP协议
IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。当传送IP数据包发生错误——比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在同一个电脑中接收到发送给不同软件的数据包,则需要依靠端口(port)来区分是发给具体某个软件,它其实是一个网卡的程序编号。传输层的功能就是建立在“端口到端口”的通信。在传输层有两个性质不同的协议:TCP(Transmission Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
TCP协议
tcp是一种面向连接的、可靠的、基于字节流的传输层通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流。TCP协议将大快数据分割成报文段(segment)为单位的数据包进行管理,为了确保无误的将数据发送到目标处,TCP协议采用了三次握手(three-way handshaking)策略。握手中使用了TCP的标志(flag)-SYN(synchronize)、ACK(acknowledgement)和seq(sequence)。
图:TCP数据发送流程图TCP三次握手过程
第一次握手:客户端发送一个含有同步序列号的标志位给服务器请求建立连接,同时客户端进入SYN_SENT状态。发送报文的同时也启动一个定时器,等待服务器确认收到这个报文段,如果不能及时收到一个确认,将重新发送这个报文段。这次握手总共做了两件事:我要和你通信、你可以用seq=x作为起始数据段来回应我。
第二次握手:服务端收到这个报文段,需要对报文段进行确认,设置ACK=x+1,seq=y,让客户端以这个序列号作为起始数据段来进行回应,这时服务器进入SYN_RECV状态。这次握手总共做了两件事:你可以和我通信、你可以用seq=y作为起始数据段来回应我。
第三次握手:客户端收到服务器的确认报文段,会先进性确认,如果收到的报文检验有差错,那么就会丢弃这个报文段,如果检验无误,则会对服务器进行回复,设置ACK=Y+1。这时客户端与服务端都进入ESTABLISHED状态,完成TCP三次握手。
若握手过程中某个阶段莫名中断,TCP协议会再次以相同顺序发送相同的数据包。
TCP四次分手
第一次分手:当客户端完成数据传输后,会对服务器发送一个FIN报文段,客户端进入FIN_WAIT_1状态。表明数据发送结束。
第二次分手:服务器收到客户端发送来的FIN报文段,会返回一个ACK报文段,ACK加一,客户端进入FIN_WAIT_2状态,意思就是我同意你的关闭请求。
第三次分手:服务器向客户端发送FIN报文段,请求关闭连接, 服务器进入LAST_ACK状态。
第四次分手:客户端收到服务器发送的FIN状态,会向服务器发送ACK报文段,ACK加一,客户端进入TIME_WAIT状态,服务器收到ACK报文段后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明服务器已正常关闭,那好,客户端也可以关闭连接了。
客户端应用程序的状态迁移图
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器的状态迁移图
CLOSED->LISTEN->SYN_RECE->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
UDP协议
UDP 是一种面向无连接,且不可靠的协议,在通信过程中,它并不像 TCP 那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且不需要确保服务端一定能收到或收到完整的数据。它仅仅提供了校验和机制来保障一个报文是否完整,若校验失败,则直接丢弃报文,不做任何处理。
图:UDP Service-Client关系图TCP与UD片间的区别
1、tcp是面向连接的,可靠性高;udp是无连接的,可靠性较低;
2、由于tcp是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差;同时过程复杂,也使其易于被攻击;而udp无连接,无建立连接的过程,因而实时性较强,也稍安全;
3、在传输相同大小的数据时,tcp首部开销20字节;udp首部开销只有8个字节,tcp报头比udp复杂,故实际包含的用户数据较少。tcp无丢包,而udp有丢包(注:网速的提升导致现在丢包率很低),故tcp开销大,udp开销较小;
4、每条tcp连接只能是点到点的;udp支持一对一、一对多、多对一、多对多的交互通信。
5、TCP对系统资源要求较多,UDP对系统资源要求较少
采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制(注:UDP本身并不具有重传机制),能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。如果对实时性要求高和高速传输的场合下需要使用udp;如果需要传输大量数据且对可靠性要求高的情况下应该使用tcp;在可靠性要求较低,追求效率的情况下应该使用udp。
应用层
应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS服务(Domain Name System,域名系统)服务就是其中两类。而HTTP协议也处于该层。
DNS
DNS(Domain Name System)服务提供了域名到IP地址之间的解析服务。计算机可以被赋予IP地址,也可以被赋予主机名和域名。比如www.18yk.com。我们通常使用主机名或者域名来访问对方的计算机,而不是直接通过IP地址访问。这就需要DNS服务来为我们将它们转换成IP地址,DNS协议通过域名的查找IP地址,会逆向从IP地址反差域名服务。
图:DNS工作流程图HTTP协议
HTTP(Hyper Text Transfer Protocol)超文本传输协议,是一种建立在TCP上的无状态连接,也是我们日常用的最多的一种协议。
图:HTTP协议工作流程图URI
URI(Uniform Resource Identifier)统一资源标识符,RFC2396分别对这 3 个单词进行了如下定义:
Uniform :规定统一的格式可方便处理多种不同类型的资源, 而不用根据上下文环境来识别资源指定的访问方式。另外, 加入新增的协议方案(如http:或ftp:) 也更容易。
Resource :资源的定义是可标识的任何东西。 除了文档文件、 图像或服务(例如当天的天气预报) 等能够区别于其他类型的, 全都可作为资源。 另外, 资源不仅可以是单一的, 也可以是多数的集合体。
Identifier :表示可标识的对象。 也称为标识符。
RFC3986列举了几种URI的常用语法格式:
1.tp://ftp.is.co.za/rfc/rfc1808.txt
2.http://www.ietf.org/rfc/rfc2396.txt
3.ldap://[2001:db8::7]/c=GB?objectClass?one
5.news:comp.infosystems.www.servers.unix
6.tel:+1-816-555-1212
7.telnet://192.0.2.16:80/
8.urn:oasis:names:specification:docbook:dtd:xml:4.1.2
TCP/IP通信传输流
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收段则往应用层上走。以HTTP举例说明:
发送端
首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。为了传输方便,在传输层(TCP协议)把从应用层收到的数据(THTTP请求报文)进行分割,并根据各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP协议),增加作为通信目的地的MAC地址后转送给链路层。这样一个网络通信请求就准备齐全了。
接收端
接受端的服务器在链路层接收到数据,按顺序往上层发送,一直到应用层。当传输到应用层才算真正接收到由客户端发送过来的HTTP请求。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之。接收段在层与层传输数据时,每经过一层会把对应的首部消去。而这种把数据信息包装起来的做法被称为封装(encapsulate)。
感言:到这里TCP/IP协议族就暂时告一乱落。写作的目的主要是最近在阅读《图解HTTP》这本书籍时产生了一些心的,并通过在网上查找相关资料进行整理总结,将之记录下来,与大家共享,也方便以后自己查阅。若其中有何错误漏洞,请大家不吝赐教。
参考资料1:https://blog.csdn.net/u011957758/article/details/72353485
参考资料2:https://www.jianshu.com/p/0cf648510bce
参考资料3:http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
--------------------- 作者:蜗牛非牛 来源:CSDN 原文:https://blog.csdn.net/qq_34003239/article/details/82992495?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!