目录
1、TCP和UDP相同点和不同点(笔试面试)
(1)TCP--->稳定
1、提供面向连接的,可靠的数据传输服务
2、在传输过程中,数据无误,数据无丢失,数据无失序,数据无重复
1>TCP会给每一个数据包编上编号,该编号称为序列号
2>每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止
3、数据传输效率低,耗费资源多
4、数据的收发是不同步的
1>为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,粘成一个包发送,该现象称为粘包现象,该粘包算法称为Nagle算法
5、TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议
(2)UDP--->快速
1、面向无连接的,不保证数据可靠,尽最大努力传输的协议
2、数据传输过程中,可能出现数据丢失,重复,失序现象
3、数据传输效率高,实时性高
4、限制每次传输的数据大小,多出部分直接忽略删除
5、收发是同步的,不会粘包
6、UDP的使用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下
2、简述一下有关端口号的内容
1、为了区分同一主机上的多个进程,使用端口号来进行处理
2、端口号是一个2字节的无符号整数,取值范围是【0,65535】
3、端口号的分类:
1>0~1023:一些特殊的端口号
2>1024~49151:正常编写服务器使用的端口号
3>59152~65535:这部分是客户端运行时候动态选择的
3、TCP服务器通信模型
1、使用socket函数(sfd = socket())创建一个用于连接的套接字文件描述符
2、使用bind函数为服务器绑定IP地址和端口号,为了让客户端能够找到服务器
3、使用listen函数将服务器套接字设置成被动通信状态,用于接收客户端的连接请求
4、使用accept函数(newfd = accept())阻塞等待客户端的连接请求,如果有客户端发来连接请求,创建一个用于通信的新的套接字文件描述符
5、使用send、recv,read、write函数进行数据的收发工作
6、使用close函数关闭套接字、关闭监听
4、UDP服务器通信模型
1、使用socket函数(sfd = socket())创建一个用于连接的套接字文件描述符
2、使用bind函数为服务器绑定IP地址和端口号,为了让客户端能够找到服务器
3、使用send、recv,read、write函数进行数据的收发工作
4、使用close函数关闭套接字、关闭监听
5、三次握手流程描述
1、第一次握手:客户端发送SYN包(SYN=1,seq=x)给服务器,并进入SYN_SENT状态,等待服务器返回确认包。这里的seq=x表示序列号是x,通常是一个随机的初始值,而不是固定的0。
2、第二次握手:服务器接收到SYN包后,发送一个SYN包(SYN=1,seq=y)和一个ACK包(ACK=1,ack=x+1)给客户端,并进入SYN_RCVD状态。这里的seq=y是服务器的初始序列号,ack=x+1是确认号,表示服务器期望收到客户端下一个数据包的序列号。
3、 第三次握手:客户端接收到服务器的SYN和ACK包后,发送一个ACK包(ACK=1,ack=y+1)给服务器。此时,客户端进入ESTABLISHED状态。服务器接收到这个ACK包后,也进入ESTABLISHED状态。这里的ack=y+1表示客户端已正确接收服务器的SYN包。
6、四次挥手流程描述
1、第一次挥手:主动关闭方(通常是客户端)发送一个FIN包(FIN=1,seq=u)给被动方(服务器),并进入FIN_WAIT_1状态。
2、第二次挥手:被动方接收到FIN包后,发送一个ACK包(ACK=1,ack=u+1)给主动方,并进入CLOSE_WAIT状态。主动方接收到这个ACK包后,进入FIN_WAIT_2状态。此时,被动方可以继续发送剩余的数据。
3、第三次挥手:被动方发送完所有剩余数据后,发送一个FIN包(FIN=1,seq=v)给主动方,并进入LAST_ACK状态。
4、第四次挥手:主动方接收到FIN包后,发送一个ACK包(ACK=1,ack=v+1)给被动方。被动方接收到这个ACK包后,关闭连接。主动方在发送ACK包后,进入TIME_WAIT状态,等待足够的时间以确保被动方接收到ACK包,然后关闭连接。
7、TCP服务器与客户端建立连接,断开连接的过程
建立连接的过程即如上所述的三次握手。断开连接的过程是四次挥手,断开连接可以由任一方发起。
8、在UDP传输中,如何知道对端掉线
1、心跳包机制,规定每隔指定时间后发送一个心跳包给服务器,服务器回复心跳包应答
2、如果期间服务器多次没有收到心跳包,或者客户端多次没有收到应答,则代表对端掉线