面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP、HTTP、UDP、这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一种协议,只要岗位涉及到了进程之间的相互通信,则一定会被询问到TCP协议,那么本篇就来总结一下TCP协议吧~
TCP协议在OSI七层模型当中,是属于传输层的协议,它是一种可靠传输的协议,这个可靠,指的是TCP可以确保通信信息不会因为网络因素导致丢包,确保接受方一定可以接受到完整的数据。在TCP可靠传输方面,常常与另一个协议——UDP协议进行对比,我们通过两者的对比,先大体对TCP协议有些了解。
1.TCP和UDP的异同点
1)tcp是面向连接的,而udp则是不需要建立连接的。
2)tcp是面向字节流的,而udp则是面向数据报的。这话的理解是udp发送的报文长度是进程给出的,而TCP发送的报文长度,则是根据对方的接受窗口和当前网络的情况决定的。可以想象TCP是按流传输,而udp是按一个一个报文进行传输的。
3)tcp是可靠传输,而udp是尽最大可能交付的协议,tcp的可靠传输主要是通过滑动窗口和发送-确认-窗口滑动机制,来确保的,而udp就是尽可能发送,不确保发送的数据是否到达的。
4)tcp是一对一的全双工的通信,而udp可以一对一,一对多,多对一,多对多的通信。
5)tcp具有流量控制,拥塞控制机制,而udp没有。
从上述的比较,可以大体把握了TCP是一个什么样的协议,那么接下来,我们来看看在面试当中涉及到TCP协议的话,必要考的一个考点,TCP的三次握手和四次挥手。
2.TCP的三次握手和四次挥手
tcp是面向连接的协议,那么两个进程需要通过tcp进行交互的时候,需要首先建立连接,这个建立连接的过程,需要来回三次通信,所以顾名思义,被较为了三次握手,那么这三次握手是一个什么样的流程?首先我们来看一下图。
在图中,着重关注几个点,Client和Server的状态变化、标志位的置1、发送序号的数字。
首先我们要发起连接请求的进程称之为Client,而被动接收连接请求的称之为Server,Server和Client在发起连接请求之前,都会创建TBC(传输控制块),这时候Server将进入监听(Listen)状态,而Client建立TCB之后,将发送连接请求。
Client将要发送的TCP报文当中的SYN标志位置1,并且在发送序号置为了x,发送到Server,这时候Client将进入SYN_SENT(同步已发送)状态。
Server接收到后,向Client回复一个SYN标志位也置1,ACK标志位置1,发送序号为:y,而确认序号为:x+1 的tcp报文,这时候Server将进入SYN_RCVD(同步接收)状态
Client接收到Server的回复报文之后,再回复一个ACK标志位置1,发送序号为x+1,确认序号为:y+1 的tcp报文,这时候Client和Server都同时进入ESTABLISH状态,连接建立。
想面试官讲解完三次握手之后,面试官可能会问出一个常规的延伸问题,为什么是三次握手,而不是两次握手呢?
这是为了防止Client已失效的连接请求报文突然又传到了Server,产生错误。举个例子详细来说,Client发送连接请求,但是因为连接请求的报文丢失而未收到确认,于是Client又一次重传了一次连接请求,后来收到了确认,然后建立了连接,数据传输完毕后,释放了连接。而第一个连接请求这时候到达了Server,Server收到了报文之后,误认为Client需要再次建立连接,就会回复这个连接请求,而这时候由于实际上Client这时候并没有发起请求,所以Client会忽略这个回复,而如果采用的是两次握手,这时候Server就已经进入建立连接的状态,白白的浪费了资源。而采用三次握手,Server就不会收到回复,则就表明这是一个无效的连接,就会中断。