如果你感觉已经被上述情景安排,那么有必要好好看看这篇文章。 另外附上一篇tcp/ip面试中的问题视频解答:面试中tcpip,哪些容易被问到的及解答 1 、什么是协议协议实际上就是一种约定。好比说,我们做一个石头剪刀布的游戏,我们约定好:石头>剪刀、剪刀>布、布>石头,以此作为游戏规则。我们所有人都遵循这个约定,那么就不需要任何的多余的沟通便可以完成这个游戏。而这种方式形成的约定实际上就是一种协议了。 2、TCP/IP协议簇话联网早期是,尽管知道计算机连接的原理,但是没有协议的时候,就没有办法进行大规模的通信使用。当时就衍生出了很多为了解决当时问题的协议,像TCP协议就是为了约定大家使用TCP连接时传输的一种协议,HTTP协议则是为了约定文本传输的一种协议。 而TCP/IP协议并不是指某一个具体的协议,它是指代一系列的协议栈,因此也叫TCP/IP协议栈或者TCP/IP协议簇。
在 TCP/IP协议簇 中,定义了包含对应 OSI 模型的每一层。但同时对 OSI 模型层做了简化处理。看看这种图理解一下: TCP/IP层和OSI参考模型层的对应关系 也即是OSI模型中的7层,在TCP/IP中使用4层代替了。没办法,谁让OSI那么复杂呢。 在TCP/IP协议簇中每一层都有对应的协议,最终组成协议簇。 TCP/IP协议栈每一层的协议 我们经常说的TCP和UDP在协议栈的传输层,而IP协议则在协议栈的网络互联层。还有经常被问到的HTTP协议实际上在协议栈的应用层。 TCP/IP协议栈被分作这么多的层级,目的是为了整理硬件间通信时的一个通用的模型,因此它们每一层都和其上下层有关联性的,如下图: TCP/IP协议栈数据封包分层 上面就是'TCP/IP协议'的总体概念了。但是其内部还有这么多的协议,这里挑几个常见的讲一讲,从底层到上层:
2. 1 IP协议IP协议处于TCP/IP协议簇的网络互联层。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据包包中传送。 在IP协议中,有两个重要的内容需要了解下。一是IP地址的概念,二是IP协议的报头。 2.1.1 IP地址的概念其实对于IP地址我们日常接触还是挺多的。它给每一个接入互联网的计算器一个地址,从而使得其他的计算机能够访问到它。与此同时,当计算机有了地址之后,才能遵循IP协议,和其他的计算机进行数据的传递。 目前有两种IP版本,分别是IPV4和IPV6。IPV4占用8个字节32bit,而IPV6则是32个字节128bit。IPV6的可用的数量极其庞大,大到全球每一粒沙子都可以分配一个IPV6地址。 以IPV4为例, IPV4的32bit地址中,分为两个部分:网络号和主机号。同时根据不同的内容开头,又分为A、B、C、D、E类。 IPV4 网络号用于区分不同的网络点,比如一个公司是一个网络集群,我们可以通过他的网络号确定该公司网关,再通过主机号确定每一台计算。 假如一个C类的IP地址类型,包含了21位网络号,实际上就能区分出 2^21 个网络号,而在每一个网络号中,可以区分 2^8 -2 = 254(起始的网络号地址和最后一个为广播地址都不可用于主机)个主机号。如果一个网吧采用这种方式的话,那么他最多能安装254台机器。如果我们想要得到更多的主机号,应该延长主机号的位数,但是相应的,网络号的数量将减少,因为两者的总长度是不变的。 通过掩码能够改变网络号和主机号的位数。 通常,我们看到的掩码类似: 255.255.255.0 二进制表示:
如果一个IPV4地址为:192.168.1.12 那么IP地址和掩码经过与运算之后的结果为:192.168.1.0(192.168.001.000), 这就是我们常说的网关! 而从 192.168.1.1~192.168.1.254都可作为主机号。也即是这个网关下,可以容纳 254 台机器。 如果将掩码更改为: 255.255.254.0 二进制表示:
那么与运算的结果为:192.168.0.0 ,这时候可以使用的主机号就变成了 192.168.0.0 ~ 192.168.1.254, 即可容纳 510 台机器。 2.1.2 IP寻址当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。 IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。 在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。 2.1.3 IP协议的报头在上面的数据分层中,我们看到IP协议的构成实际上是 IP报头 + TCP协议内容。 因此决定一个IP协议属性的的关键是 IP报头的内容。 下面我们来看下IP协议的组成,IPV4中普通的IP首部长20个字节。其中有32位的源IP地址和32位的目的IP地址。 TTL:生存时间。代表了数据包可以经过的最多路由器数。比如TTL为10,意思是如果经过10次路由器转发,仍然未找到目的地址,则报文丢弃 8位协议指示的是传输层承载的协议 16位总长度:指IP数据包的最大长度。16bit那么最长可达65535字节。但是通过链路的MTU不会有这么大。因此如果数据包长度超过了MTU,数据包会被分片。如果发生了分片,则需要用到16位标识以及13位片偏移来找到分片的报文。 IP协议报头 2.2 TCP协议 2.2.1 TCP协议作用 TCP协议位于协议栈的传输层。当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。 TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法)。 该算法主要包括三个主要部分: (1)加性增、乘性减; (2)慢启动; (3)对超时事件做出反应。 2.2.2 TCP的报头和IP协议一样,TCP协议也有他的报头部分。 以下即是图示: TCP报头
2.2.2 TCP协议的连接时候的三次握手TCP是一个面向连接的协议,在每一次传输数据前,客户端和服务端需要进行连接,这个链接就是著名的三次握手。
图解: TCP的三次握手 思考:为什么要进行三次握手,而不是两次呢? 比如在第一次握手之后,服务器进入准备状态,然后发送消息给客户端,客户端也进入准备状态,这就完成了双方的确认了。
思考2:三次握手就很安全了吗?
#netstat -nap | grep SYN_RECV 2.2.3 TCP协议的断开连接时候的四次挥手既然TCP面向连接,那么肯定也有断开连接的操作。一个TCP完整的断开需要进行四次挥手。
TCP四次挥手 思考:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
思考:为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
2.3 UDP协议UDP协议全称是用户数据包协议,在网络中它与TCP协议一样用于处理数据包,两者同处于协议栈的传输层,和TCP不同的是,UDP是一种无连接的协议。 因为UDP是无连接的,所以相对来说,UDP的报头比TCP要简单多了。 UDP报头
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。 2.4 HTTP协议 HTTP协议名为超文本传输协议。这个协议在 TCP/IP 协议栈的应用层,因此我们无需操心HTTP是如何传输的,只需要关心,我们传输的内容,能否正确的被接收端识别。 HTTP 基于TCP实现,简单来说,TCP协议负责可靠的内容传输,HTTP协议负责识别内容,两者本身不在一个层面,没有可比性。 HTTP无状态的意思是,每一次的内容解析是没有关联的。TCP有状态是指两端在连接过程的。 HTTP包含两种报文类型:请求报文、响应报文。请求报文用在客户端对服务器的请求时使用的报文格式,响应用在服务器响应请求的报文格式。 2.4.1 HTTP协议请求消息结构 客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。 HTTP请求消息体结构 HTTP消息体主要包含以下实质内容(空格和换行也必不可少):
以下是一个HTTP请求的例子: HTTP请求实例 2.4.1.1 HTTP请求方法 HTTP包含了多种不同的请求方式,每一种请求方式用在不同的场景。 HTTP请求方法 2.4.1.2 URL —— 统一资源定位符 URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。 URL的一般语法格式为: (带方括号[]的为可选项): protocol :// hostname[:port] / path / [;parameters][?query]#fragment
总结一下如下图: 附一张解析图 2.4.1.3 HTTP请求头 请求头中主要包含本次请求的附加信息,其中常用的字段如:
Date 请求发送的日期和时间 2.4.1.4 HTTP请求体 在整个报文中,请求头之后,隔一行空格,以下部分就是HTTP的请求体了。 请求体是我们发送请求的时候需要传给接收端的内容。其格式需要和请求头中的Content-Type对应。不然会导致接受无法识别。 如上图中的请求题: name=tom&password=1234 2.4.2 HTTP响应 HTTP的响应同样分为:响应行、响应头、响应体。和请求报文有点类似。 总体结构如图: HTTP响应报文 2.4.2.1 HTTP响应行 响应行中包含了HTTP的版本和本次请求的状态。请求状态的对应值见 HTTP响应码大全. 2.4.2.2 HTTP响应头响应头用于描述服务器的基本信信息、数据的描述,这些信息将告知客户端如何处理响应题中的内容。
2.4.2.3 HTTP响应实体 响应实体中包含的就是客户端从服务器中获取的数据了。数据的格式和长度都会在响应体头中描述。
|
|