TCP和UDP的区别
TCP面向连接,UDP面向非连接
TCP保证数据顺序,UDP不保证
TCP保证数据正确性,UDP不保证
TCP对系统资源要求多,UDP要求少
TCP传输速度慢,UDP速度快
可靠传输服务
保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。
序号
TCP首部的序号字段用来保证数据有序地进入缓存区,序号值是报文段发送的数据的第一个字节的序号。
累计确认
TCP首部的确认号是期望收到对方的下一个报文段序号,只确认至第一个丢失字节为止的字节。
重传
导致重传的两种事件:超时和冗余ACK。
1.超时
每发送一个报文段,就设置一个计时器。如果计时器时间到了但没有收到确认,则重传该报文段。问题是超时周期太长。
2.冗余ACK
冗余ACK指再次收到某个报文段的ACK。每当比期望序号大的失序报文段到达时,接收方发送一个冗余ACK,指明下一个期待字节的序号。当发送方收到对同一个报文段的3个冗余ACK时,就认为这个被确认报文段之后的报文段已经丢失,然后对这个丢失的报文段进行重传。
三次握手和四次挥手
为什么客户端最后还要发送一次确认呢?
防止滞留一段时间的连接请求报文突然又传送到了服务器端,从而产生错误。如果采用两次握手,该请求报文会重新建立连接,造成资源浪费;如果采用三次握手,该请求报文会使服务器端发送SYN+ACK报文,但是客户端不会再次发送ACK报文(客户端只想建立一次连接),不会重新建立连接。
为什么客户端最后还要等待2MSL(MSL,Maximum Segment Lifetime,段的最长寿命)?
保证客户端发送的最后一个ACK报文能够到达服务器端。如果该报文丢失了,则服务器端会再次发送FIN报文,客户端在2MSL时间段内收到该报文,重传ACK报文并重启2MSL计时器。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接时,服务器端在LISTEN状态下,收到连接请求SYN报文后,发送SYN+ACK报文给客户端。 关闭连接时,服务器端收到客户端FIN报文时,只表示客户端不再发送数据但是还能接收数据,服务器端先发送ACK报文给客户端后,再发送FIN报文给客户端表示同意关闭连接,即ACK和FIN分开发送,从而导致多了一次。