1.TCP的介绍:
TCP(传输控制协议),位于OSI模型中的传输层,与它经常一块被提及的协议为UDP。
2.TCP的首部格式:
注解:
(1)源/目的端口号:表示数据是从哪个进程来到哪个进程去;
(2)序号:([0,2^32-1]),TCP连接中传送的字节流,每一个字节都按需编号,当序号增加到2^32-1之后,下一个又回到0.
(3)确认号:期望收到对方下一个报文段的第一个数据字节的序号。【确认号=N:表明到序号N-1为止的所有数据都已正确收到】
(4)4位首部长度:表示该TCP头部有多少个32位bit位(即有多少个4字节),因为4位二进制数能够表示的最大十进制数字是15,所以TCP首部最大长度为60字节,一般采用标准长度:20个字节。
(5)6位标志位:
a.URG:表示紧急指针是否有效(当URG=1时,此时带有URG的数据会被优先处理)
b.ACK:表示确认号是否有效
c.PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
d.SYN:在建立连接的时候用来同步序号
e.RST:对方要求重新建立连接,把携带RST标识的称为复位报文段
f:FIN:通知对方,本端要关闭了,把携带FIN标识的称为结束报文段。
(6)窗口大小:接收方告诉发送方从该报文首部中的确认号算起,自己接收缓冲区的大小(即能允许发送方发送的数据量)
3.TCP三次握手【创建连接的过程】
图解:
第一次握手:
客户端发送一个SYN为1的TCP报文段,表明客户端向服务器发出连接请求,以及初始序号X保存在报头的序列号字段里【TCP规定SYN报文段不能携带数据,但要消耗一个序列号】,即TCP第一握手后的首部格式为:
第二握手:服务器接收到客户端发送的连接请求,向客户端发送确认,此时SYN,ACK均被置为1,同时服务端也要消耗自己的一个序列号,确认号为ack=ack+1,即X+1,还要发送自己的序号seq=Y;TCP第二次握手后的首部格式变为:
第三次握手:客户端收到服务端的确认之后,还要向服务端发送确认告诉服务器自己收到服务器的确认,此时SYN=0,ACK=1,seq=X+1,ack=Y+1;则TCP第三次握手后的首部格式为:
其实从上述的TCP过程中可以发现,TCP三次握手的实质,其实就是客户端与服务端之间交换三个TCP报文段。
SYN攻击(是一种典型的D-DOS攻击):
攻击客户端,在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器需要不断地重发直至超时,这些伪造的SYN包长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
4.TCP的四次挥手【即断开连接的过程】
图解:
第一次挥手:
客户端向服务端发送连接释放报文段,并停止发送数据,此时FIN=1,seq=u,进入FIN-WAIT1状态,等待客户端的确认。
则TCP第一次挥手之后的首部格式为:
第二次挥手:
服务端收到客户端发送的的连接释放报文之后,对客户端发出确认,此时ACK=1,确认序号为ack=u+1,自己的序号为w,
客户端在接收到服务端的确认后,进入FIN-WAIT2状态,等待服务端发送连接释放报文段。TCP第二次挥手之后的首部格式为:
第三次挥手:
因为TCP协议是全双工的, 前两次挥手只是表明客户端没有数据要发送给服务端,并不表示,服务端没有数据要发送给客户端,此时若服务端向客户端发送连接释放的报文段,则ACK=1,FIN=1,seq=w,还要重发上次已经发送过的确认号ack=u+1;这时服务端就进入LAST—ACK状态,等待客户端确认。
即,TCP进行第三次挥手之后的首部格式为:
第四次挥手:
客户端收到服务端发送的报文段之后,进行确认,此时,ACK=1,ack=w+1,seq=u+1,服务端收到客户端的确认之后就关闭连接,而客户端在经过2MSL后也关闭连接。此时TCP首部格式为:
5.为什么握手是三次,而挥手是四次呢?
(1)握手是三次:在TCP建连接的时候,服务器对客户端发送的连接请求进行确认的时候,可以先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),此时TCP创建连接的过程就变成了四次握手,但和三次握手的效果是一样的;
(2)挥手是四次:因为TCP是提供全双工通信的,已上图四次挥手图解为例,前两次挥手只表明客户端没有数据要发给服务端,而不能说明服务端没有数据发给客户端,所以服务端没有数据要发的时候也要进行两次挥手,所以整个释放连接的过程就是四次挥手啦。
6.TCP创建连接的过程为什么不是两次握手?
假设TCP创建连接的时候是两次握手,假设服务端发送给客户端的确认,在传输的时候丢包了,那么对于服务端来讲,服务端,认为连接创建成功,等待客户端发送数据,而对于客户端来说,它在TCP第一次握手之后一直等待服务端确认,而服务端的确认在传输过程中丢包,所以此时对于客户端而言,它认为连接没有创建成功,所以会向服务端重新发送连接请求,这个时候呢,服务端就要花费资源去维护,如果有大量的客户端发生这种情况,那么服务器就会浪费很多的资源,甚至会挂掉。
7.为甚四次挥手释放连接时等待2MSL?
(1)为了保证客户端发送的最后一个ACK报文段能够到达服务端
在TCP进行第四次挥手时,客户端发送给服务端的ACK报文段有可能丢失,所以服务端收不到客户端的确认,此时服务端会超时重传ACK+FIN报文段,因而客户端就能够在这2MSL内收到服务端重传的报文段,然后对其进行确认,重新启动2MSL,最后客户端和服务端都进入CLOSED状态。
(2)防止“已失效的连接请求报文段”出现在本连接中
A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样就不会使已失效的连接请求报文段出现在新的连接中。
8.TCP 和 UDP的区别:
(1)UDP是无连接的,TCP是有链接的,TCP在发送数据之前TCP的客户端与服务端必须通过三次握手创建连接,数据传输完成之后,必须通过四次挥手释放连接;
(2)UDP传输数据是尽最大努力交付的(即不可靠),TCP协议通过保证数据按序到达,确认应答,提供超时重传来保证可
靠性;
(3)UDP是定长报头(8个字节),TCP的首部最大长度是60字节(标准是20字节);
(4)TCP有流量控制和拥塞控制,UDP没有,网络堵塞不会影响发送端的发送速率;
(5)UDP面向数据报,TCP面向字节流;