TCP(Transfer Control Protocol)(传输控制协议)
建立主机A和B的TCP连接
TCP三次握手建立连接:
1、主机A向B发送建立连接的请求,发送请求SYN报文,序号X,此时A主动打开连接
2、服务器B收到A发送的请求报文后,向A发送一个确认收到的ACK报文,序号为X+1,同时向A发送请求SYN报文,序号为Y,B被动打开连接
3、A收到B的ACK确认报文和SYN报文后,向B发送ACK=Y+1的报文
为什么建立TCP连接需要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
例如:当客户端向服务器发送一个SYN请求报文后,客户端在一定的时间内没有收到来自服务器端的确认报文,则客户端超时重传。
在某一时刻,服务器接收到了之前失效的请求SYN报文后,如果没有三次握手的话,则服务器收到失效报文后,向客户端发送确认报文后,则认为连接建立,则服务器开始等待客户端发送数据,而客户端收到服务器端的确认报文后,发现自己并没有发送请求,直接将该确认报文丢弃,则服务器一直等待客户端发送报文,白白浪费资源。而用了三次握手的话,则服务器收到失效报文后,进入半连接队列,向客户端发送确认报文后,客户端收到报文后,直接丢弃,不会发送确认报文,则一定时间后,服务器没有收到来自客户端的确认报文,则认为该半连接队列失效,将该半连接从队列中删除。
三次握手的目的是为了保证在不可靠的信道上,传送可靠的数据,也就是为了在某件事情上达到共识,三次握手不是TCP的本身要求,是理论上的最小值。
TCP四次关闭连
1、客户A向B服务器发送FIN=X的请求关闭报文,A主动关闭,A不能发送数据,仍然可以接收来自B的数据
2、主机B收到A的报文后,向A发送确认ACK=X+1的报文,B被动关闭,此时,B可以发送数据,
3、主机B向A发送关闭请求报文FIN = Y,B此时不能发送数据
4、客户A收到A发送的请求关闭报文,向B发送确认报文ACK=Y+1,断开TCP连接。
为什么TCP建立连接是三次握手,而关闭连接是四次握手?
TCP是全双工的,当客户端发送关闭连接请求报文FIN时,客户端主动关闭连接,服务器端收到FIN报文后,向客户端发送ACK确认报文,此时,仅仅是客户端没有数据发送给服务器端,而服务器仍可能有数据发送给客户端, 所以在这种情况下,必须将ACK确认报文和请求关闭连接FIN报文分开发送,最后客户端收到了来自服务器端的FIN关闭连接的请求后,发送确认报文,则服务器收到确认报文后关闭连接。
半打开状态和半连接状态有什么区别?
TCP的半开连接(half-open)是指TCP一端主动请求建立连接,收到确认后,另一端的请求连接没有收到确认时的一种状态。 TCP的半关闭是指TCP连接的一端主动关闭了连接,但是仍然可以接收来自另一方发送的数据的一种状态。
TCP(Transfer Control Protocol)打电话,先建立连接,我先拨打电话,对方拿起电话的时候,双方建立了连接。我先说的一句话在我后说的一句话之前到底。
面向连接的保证可靠传输的连接,通过TCP连接,得到顺序的无差错的数据流
UDP(User Datagram Protocol)发信件。(发的信,对方能否收到,上午发的信和下午发的信,可能下午发的信先到)
面向无连接的不可靠的用户数据报协议。不可靠的两个表现:1、发送的数据对方没有收到2、我先发送的数据,在我后发送的数据之后到达,顺序不对
UDP与TCP的区别?
1、TCP耗时,在TCP通过三次握手建立连接耗费一定的时间,UDP不需要建立连接,则耗费时间少
2、数据的大小,UDP数据包的大小大小限制(64KB),TCP没有限制
3、UDP接收到的数据并不一定与发送顺序相同,TCP传输是可靠的,接收的数据的顺序与发送的数据顺序相同。
对实时性比较高,数据很重要的,不能容忍丢失数据必须使用TCP
为什么有了UDP还要使用TCP?
TCP占用资源比较多,比较耗时
在应用过程中不需要严格的数据传输,丢失部分数据或者传输顺序发生错误对使用时没有影响的,这时使用UDP更好