TCP/IP协议栈参考模型分为五个层次:
应用层、传输层、网络层、链路层和物理层。
① 应用层:是网络应用程序及其应用层协议存留的层次。该层包括了所有与网络相关的高层协议,如文件传输协议(FTP)、超文本传输协议(HTTP)、远程终端协议(Telent)、简单邮件传送协议(SMTP)、因特网中继聊天(IRC)等。
② 传输层:使源端主机和目标端主机上的对等实体可以进行会话。该层有两种服务质量不同的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
③ 网络层:通过路径选择把分组发往目标网络或主机,进行网络拥塞控制以及差错控制,是整个TCP/IP协议栈的核心。
④ 链路层:负责网络层和物理层之间的通信,将网络层接收到的数据分割成特定的可被物理层传输的帧,并让物理层进行实际的数据传送。
⑤ 物理层:将帧中的一个个比特从一个节点移动到下一个节点。该层的协议仍与链路相关,并进一步与链路的实际传输媒体相关。
TCP三次握手
三次握手是TCP用来确保连接可靠建立的方式:
第一次握手: A给B发短信说:“B,你现在有空吗?”
第二次握手: B此时收到了A的信息,然后对A说: “ 我有空,你呢?有空吗? ”
第三次握手: A此时收到了B的确认信息,然后说:“我也有空,那我跟你说个事。”
在三次握手之后,A和B都能确定这么一件事: 双方的通信可以流畅的进行。 这样,双方就可以开始进行正常的对话了。
TCP四次挥手
四次挥手是TCP用来确保连接可靠关闭的方式:
第一次挥手: A给B发短信说:“B,我要准备吃饭了?”
第二次挥手: B此时收到了A的信息,然后先对A说: “ 我知道了。”
第三次挥手: B对A说到: “ 我也要准备吃饭了。”然后放下了手机,
第四次挥手: A此时收到了B的确认信息,然后想B发一个包说:“好的,我知道了。”这时才放下 手机去吃饭,
在四次挥手之后,A和B都能确定这么一件事: 双方的通信可以正常关闭。 这样,双方就可以确定对方已经完全知晓自己确认要关闭连接。
1、三次握手:
Client:请求连接;
Server:同意并请求连接;
Client:同意。
2、四次挥手:
Client:请求关闭;
Server:同意;
【Server:…(可能在继续发未发完的数据/也可能没有)】
Server:请求关闭;
Client:同意。
TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2 ∗ ∗ ∗ ∗∗ * ∗∗∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
因为断开需要两边都断!!!
由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接
通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手。
(1)连接方面的区别,http1.1 默认使用持久连接,而 http1.0 默认使用非持久连接。http1.1 通过使用持久连接来使多个http 请求复用同一个 TCP 连接,以此来避免使用非持久连接时每次需要建立连接的时延。
(2)资源请求方面的区别,在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
(3)缓存方面的区别,在 http1.0 中主要使用 header 里的 If-Modified-Since,Expires
来做为缓存判断的标准,http1.1则引入了更多的缓存控制策略例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
(4)http1.1 中还新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP
地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,就可以将请求发往同一台服务器上的不同网站。
(5)http1.1 相对于 http1.0 还新增了很多方法,如 PUT、HEAD、OPTIONS 等。
TCP面向连接,通过三次握手建立连接,四次挥手接除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。
TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行
传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不
会使源主机的发送速率降低。
每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。
TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
DNS(Domain Name System,缩写为DNS)即域名系统,域名系统是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。DNS域名系统的主要组成部分是解析器和域名服务器,服务器有转发服务器和主服务器两种。在同一个网络中,所有主机的IP地址及其对应的域名都被保存在域名服务器中,一个IP地址能对应很多个域名,一个域名则只能对应一个相应的IP地址。因为一个服务器对应一个IP地址,在一台只有一个IP地址的服务器上可以有多个网站,而不同的网站域名是不同的,所以可以有多个域名。
DNS是一种可以将域名和IP地址相互做映射的层次结构的分布式数据库系统,它主要包括了域名空间(domain name space)和资源记录、域名服务器(name server)、解析器(resolver);
DNS系统采用递归查询请求的方式来相应用户的查询,其一般过程如下:
1)客户端首先向首选域名服务器查询;
2)首选域名服务器检查本地资源记录,如果存在则作权威回答,如果不存在,则检查本地缓存,如果有记录则直接返回结果。若本地资源记录和缓存记录都不存在,则向根域名服务器查询;
3)根域名服务器返回相应顶级域的权威域名服务器的地址,首选域名服务器继续向该顶级权威域名服务器查询;
4)顶级权威域名服务器返回次级域的权威域名服务器地址,首选域名服务器如此迭代查询,直到得到对查询域名的权威回答,保存在本地缓存中并返回给客户端,完成此次查询;
查询方式:
迭代查询:客户端从本地DNS服务器发出请求后,一直处于等待状态,直到本地名称服务器返回查询结果。
递归查询:客户端和本地DNS服务器的查询就属于递归查询,客户端发出查询请求后处于等待状态,本地DNS以客户端的身份询问下一个DNS服务器,直到本地DNS服务器返回确定回复或者否定回复。