TCP/IP原理解析

1,240 阅读6分钟

一、TCP/IP模型

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。
基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与OSI模型各层的对照关系。

二、各个网络层相关的协议

  • 应用层协议种类比较多,HTTP、FTP都属于应用层协议应用层协议一般以一下格式作为请求行 {protocal}://ip|domain
  • TCP/UDP协议在传输层,将数据以TCP协议的拆包,建立链接,并以数据包的形式将网络数据传输到指定的IP地址上。
  • IP协议运用在网络层,负责对数据加上IP地址,通过网络IP地址来路由目标服务器位置。
  • ARP即RARP协议运用在数据链路层,ARP是根据IP地址获取MAC地址。RARP协议是通过MAC地址获取IP地址。

三、TCP与UDP的区别

TCP/UDP都是传输协议,但是两者具有不同的特性,同时也具有不同的应用场景,下面以图标的形式对比分析。 面向报文:面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。 面向字节流:面向字节流的话,虽然应用程序和TCP的交互式一次一个数据款,但TC把应用程序堪称式一连串的无结构的字节流。TCP传输的报文长度都是固定的。
TCP的使用场景:当对网络通讯质量由要求的时候,比如:HTTP、HTTPS、FTP、POP、SMTP等协议。
UDP的使用场景:当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这是就可以使用UDP。即时通信类软件基本用的就是UDP协议进行通信的。

四、DNS

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

五、三次握手

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须现在双方之间建立一条连接。再TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的时同步连接双方的序列号和确认号并交换TCP窗口大小信息。 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,想服务器发送ACK报文段,这个报文段发送完毕后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

六、四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传输完毕,肯定是要段考TCP连接的,那对于TCP的段考连接,这里就有了“四次挥手”的概念 第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为什么需要四次挥手:是因为TCP请求是一个全双工的请求,主机双方都能够发送数据 所以需要互相通知对方自己已经没有需要发送的数据了,当本方没有需要发送的数据就会向对方发送一个FIN报文段。

为什么要等待2MSL:MSL:报文段最大生存时间,他是任何报文段被丢弃前再网络内的最长时间。原因有二:

  • 保证TCP协议的全双工连接能够可靠关闭
  • 保证这次连接的重复数据段从网络中消失
    第一点:如果主机1直接CLOSED了,那么由于IP协议的不可性或者是其他网络原因,导致主机2没有收到主机1最后恢复的ACK。那么主机2就会再超市之后继续发送FIN,此时由于主机1已经CLOSED了,就找不到与重发的FIN对应的连接。所以,主机1不能直接进入CLOSED,而是要保持TIME_WAIT,但再次收到FIN的时候,能够抱枕给对方接收到ACK,最后正确的关闭连接。
    第二点:如果主机1直接CLOSED,然后又再向主机2发起一个新连接,我们不能保证这个新连接与杠关闭的连接的端口号是不同的。也就是说有可能新连接和老链接的端口号是相同的。一般来说不会发送什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老链接端口号是一样的,如果前一次连接和某些数据仍然滞留在网络中,这些延迟数据在建立连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混肴了。