1.TCP基础知识
TCP三次握手
过程
第一步:客户端的TCP向服务端的TCP发送一个TCP报文段,SYN=1。
第二步:当报文段到达服务端时,服务器从数据报TCP发送允许连接的报文段(SYNACK报文段)。SYN=1。
第三步:收到SYNACK报文段后,客户为该连接分配缓存和变量。客户端向服务端发送一个报文段,对服务器的允许连接进行确认。SYN=0。
为什么需要三次握手?
如果是一次握手,那么客户端连服务端有没有收到报文都不知道,不行。
如果是二次握手,那么当客户端与服务端建立连接之后,如果客户端之前丢失的报文再次传输到服务端,这时候服务端就会这个之前的报文进行确认,导致建立多个连接,发生错误。
如果是四次握手,那么服务端会在连接之后再发送一个确认报文,这个操作是可以的,但是没必要,浪费资源。
四次挥手
第一步:客户端发出一个关闭连接的报文段;
第二步:服务端接收到该报文之后,向客户端发送ACK报文段;
第三步:服务端发送自己的终止报文段;
第四步:客户端对服务器的终止报文段进行确认,两台主机的所有连接资源被释放。
为什么是四次挥手
因为客户端发送FIN报文,只是表示客户端想关闭连接,服务端可能还因为有数据在传输而不想关闭,等到服务端想关闭的时候自己再发送一个FIN报文去表示自己想关闭连接。
CLOSE_WAIT
CLOSE_WAIT是TCP四次挥手的过程中,客户端已经关闭了连接,而服务端还没有关闭连接之间的一段时间。需要CLOSE_WAIT的原因就是客户端关闭连接之后,而服务端可能还想继续传送数据,就还没发起关闭连接的请求。
TIME_WAIT
TIME_WAIT是TCP在四次挥手中客户端接受到服务端的请求终止报文(FIN),自己发送ACK之后的一个状态,等待若干时间后再把连接关闭。
需要等待的原因有:
1.当客户端收到服务端的请求连接报文后,会发送ACK进行确认,如果这个过程中ACK丢失了,实际上连接可以关闭,但服务端会错误地认为连接还没有关闭。因为有TIME_WAIT这个状态,如果客户端发送的ACK丢失了,可以再次发送ACK给服务端。
2.用于将服务器的资源释放,防止前一个连接的报文段被当作后一个连接的报文段,引起数据紊乱。
TCP连接状态的变迁
客户端
服务端
TCP和UDP的区别
1) TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
2) 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击;UDP没有建立连接的过程,因而实时性较强,也稍安全
3) 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而UDP有丢包,故TCP开销大,UDP开销较小
4)每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信。
5)TCP面向字节流,UDP面向报文。
滑动窗口
机制
数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接