OKHTTP基础篇之TCP/IP协议(二)

计算机网络体系结构分层

图1 计算机网络体系结构分层

图2 计算机网络体系结构分层

上一节说的HTTP协议属于OSI的应用层,这一节主要讲解TCP协议和IP协议。

TCP/IP 基础

TCP/IP协议族并非只有TCP协议和IP协议,它是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。TCP/IP 可以认为就是互联网的协议。


图3 TCP/IP协议族

传输层中的 TCP 和 UDP

OSI 和 TCP/IP 模型在传输层定义两种传输协议:TCP(或传输控制协议)和 UDP(或用户数据报协议)。
TCP和UDP区别:


图4 TCP和UDP区别
TCP优点

可靠,稳定。
TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP缺点

慢,效率低,占用系统资源高,易被攻击 。
TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。
而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP优点

快,比TCP稍安全。
UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP缺点

不可靠,不稳定 。
因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

什么时候用TCP

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
在日常生活中,常见使用TCP协议的应用如下:

  • 浏览器,用的HTTP
  • FlashFXP,用的FTP
  • Outlook,用的POP、SMTP
  • Putty,用的Telnet、SSH
  • QQ文件传输
    ……
什么时候用UDP

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。
比如,日常生活中,常见使用UDP协议的应用如下:

  • QQ语音
  • QQ视频
  • TFTP
    ……
TCP三次握手

tcp的6种标志位的分别代表:

  • SYN(synchronous建立联机)
  • ACK(acknowledgement 确认)
  • PSH(push传送)
  • FIN(finish结束)
  • RST(reset重置)
  • URG(urgent紧急)
  • Sequence number(顺序号码)
  • Acknowledge number(确认号码)


    图5 三次握手

第一次握手:客户端发送SYN(SYN=1)包建立连接,并随机产生顺序号码Seq=X,客户端从COLOSED进入SYN_SENT状态;
第二次握手:服务端接收到客户端的SYN包,发送确认包ACK=1,确认号码ack=X+1;并发送自己的SYN包,产生随机顺序号码Seq=Y;服务端从COLOSED进入SYN_RECV状态;
第三次握手:客户端响应服务端的SYN+ACK包,发送确认包ACK=1,确认号码ack=Y+1,顺序号码seq=X+1;进入ESTABLISH状态。

为什么不能用两次握手进行连接?
TCP四次挥手
图4 四次挥手

第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传输。其中终止标志位FIN=1,序列号seq=X。
第二次挥手:服务器收到这个FIN,发送一个ACK,确认号码为收到序列号加1,ack=X+1;
第三次挥手:关闭服务器到客户端的连接,发送一个FIN给客户端;
第四次挥手:客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
需要特别注意的是,客户端发送ACK确认后,并没有立即COLOSED,而是进入WAIT_TIME阶段,在等待2MSL时间后,才真正COLOSED。

为什么要经过2MSL时间后才COLOSED?

假如网络是可靠的,自然没有必要进入等待区,直接关闭。但是遇到网络不可靠是我们无法避免的情况,我们无法保证最后发送的ACK报文一定会被服务端接收到,因此服务端处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,这个WAIT_TIME阶段的作用就是用来重发可能丢失的ACK报文。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当服务端收到客户t端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

你可能感兴趣的:(OKHTTP基础篇之TCP/IP协议(二))