TCP协议与UDP协议
TCP协议
是一种是可靠的传输协议,是一种流式协议(以数据流的形式进行通信);
是一种安全协议(全双工通信,收发信息都需收到确认信息才能完成收发)
TCP协议的特点:
(1)可靠,慢,全双工通信;
(2)建立连接需要经历三次握手,断开连接需要经历四次挥手;
(3)在建立起连接后,发送每一条信息都有回执;而且为了保证数据的完整性,还有重传机制(超时重传,数据确认)
UDP协议
不可靠传输协议,是一种数据报文协议
UDP协议的特点:
(1)快,无连接;
(2)不安全,可能回丢失数据
TCP三次握手四次挥手
TCP三次握手
(1)第一次握手:client和server都处于关闭的状态。客户端将6位标志位SYN(表示一个连接请求)置为1,随机产生一个序列值seq=x,将数据包发送给server,client进入SYN_SENT(同步已发送)状态,等待Server确认。
(2)第二次握手:server端在收到数据包后,由SYN=1,seq=x知道了client正在请求连接,将SYN和ACK都置为1,ack=x+1,同时随机产生一个序列值seq=y,将数据包发送给client告知其确认请求连接,server端进入了SYN_RECV(同步已接收)状态,此时系统应该为TCP连接分配TCP缓存和变量;
(3)第三次握手:client在接收到数据包后,通过ACK=1,ack=x+1知道server已经同意了自己的连接请求,将ACK 置为1,ack=y+1,将数据包发送给server。Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。
帮助记忆:
西门大郎和潘小莲
# 【第一次握手】
西门大郎对王婆说:我家财万贯,去告诉隔壁的潘小娘皮,我想和他花前月下(SYN=1,seq=x);
# 【第二次握手】
王婆对潘小莲说:隔壁西门官人,人帅钱多,想和你花前月下;潘小莲:我也喜欢西门官人(ACK=1,ack=x+1,SYN=1,seq=y);
# 【第三次握手】
王婆对西门:官人,小莲已经同意了。西门:王妈妈,这是50两金子,今晚告诉小莲,我在后花园等她(ACK=1,ack=y+1,seq=x+1);
此时两者的联系已经建立了
面试问题:为什么client还需要发送一次确认了?可以两次握手吗?
答:主要为了防止失效的请求连接有传到了server。client A需要连接 server B,由于网路原因,第一次请求没有到达B,于是A又发送了一次请求,B收到了第二次请求并确认,建立起连接,后来第一次的请求终于到达了B,B以为A又发送了一次连接请求,于是向A发送确认报文段。如果不采用三次握手的话,只要B确认了,新的连接就建立起来了,但是此时A不理睬B也不向B发送数据,B一直在等待A的确认,就造成了资源的浪费。
面试题2:Server端容易受到SYN洪水攻击?
答:server端的资源是在二次握手的时候分配的,client 端的资源是在三次握手的时候分配的,所以server端容易受到SYN泛洪攻击。SYN泛洪攻击是指client在短时间伪造出大量不存在的IP向server端发送连接请求,server回复确认包,并等待client确认。但是由于源地址不存在,server需要不断得重发直至超时,这就使得正常的SYN请求因为队列满了被丢弃。
措施:
(1)降低主机的等待时间使主机尽快的释放半连接的占用;
(2)短时间受到某IP的重复SYN则丢弃后续请求。
注意:
# 在高并发的情况下,服务器一般处于SYN_RECV状态
TCP四次挥手:
断开,可以是server和client任意的一方发起请求。
这里以客户端断开为例:
client这边已经没有要发送给server的数据,主动发起断开链接的请求
(1)第一次挥手:将FIN置为1,同时随机生成一个序列号seq=u,将数据包发送给 server端,此时client端进入FIN_WAIT_1状态;
(2)第二次挥手:server端收到client发送过来的报文段后,知道client那边已经没有数据传给自己了,但是自己还有数据没有传完。因此,将ACK置为1,ack=u+1,seq=v,将数据包发送给client。此时,server端处于close_wait状态,客户端--->服务端传输链接断开。client收到server发送的ACK报文后,进入FIN_WAIT_2状态。
(3)第三次挥手:server没有数据要传输给client了,向client发送FIN报文(FIN=1,ACK=1,ack=u+1,seq=w),服务端此时进入最后确认状态(LAST_WAIT),等待client 的确认。
(4)第四次挥手:client收到server端发出的FIN报文后,向server发送ACK报文(ACK=1,ack=w+1,seq=u+1),A进入TIME_close状态。经过一段时间后进入close状态。
面试题:为什么client在Time_wait后需要等待2MSL?
答:(1)确保client发送的最后一个ACK报文能够到达server;
(2)防止已失效的链接出现在本次链接中。
为什么TCP挥手是四次,而不是三次?
答:TCP是全双工通信。server端和client端都可以接收和发送消息。挥手过程不像握手过程那样,可以把ACK、SYN放在同一报文里。一般都由一方主动发起,另外一方被动关闭。(1)发起的那一方先发送FIN报文(表示它没有数据传给被动方);
(2)被动方收到FIN报文后,但是它还有数据没有传完,所以先发送一个ACK报文;
(3)期间被动方还可以传输数据,待数据传输完毕后再发送一个FIN报文;
(4)主动方收到FIN报文,再发送一个最后确认报文(ACK),主动方进入Timewait状态;
(5)经过一段时间后,主动方关闭连接,被动方关闭连接。