[C++面试高频]C++基础(五)

1.说说三次握手

三次握手就是TCP连接时,共发送三个包。三次握手的作用就是确认客户端与服务器端的发送能力与接收能力、指定初始化序列号为后面数据的可靠性传输做准备。

一开始客户端处于CLOSED状态,服务器端处于LISTEN状态。

一次握手:客户端发送SYN报文,seq=x的包给服务器,此时客户端处于SYN_SEND状态。

二次握手:服务器接收到以后,发送ACK、SYN报文,ack=x+1,seq=y的包给客户端。此时服务器处于SYN_REVD状态。

三次握手:客户端接收到后,返回ACK报文、ack=y+1,seq=x+1给服务器。此时客户端处于ESRTABLISHED状态,服务器在接收到ACK报文后也处于ESTABLISHED状态。此时连接建立。

在socket编程中,客户端执行connect()函数会触发三次握手。

2.为什么要三次握手,两次不行吗?

不行。分别从三次握手的作用来看:

一次握手,客户端发送网络包,服务器端接收网络包。证明客户端发送正常,服务器端接收正常。

二次握手,服务器端发送网络包,客户端接收网络包。证明服务器端接收和发送正常,客户端发送和接收正常,但是服务器没法确认客户端接收是否正常。

三次握手,客户端发送确认网络包,服务器端接收网络包 。服务器确认客户端接收和发送能力正常。

因此需要三次握手才能确认双方发送和接收能力正常。

两次握手时,如果客户端第一次发送连接请求,请求延迟或丢失,服务器端并没有接收到连接请求,此时客户端再一次发送连接请求,服务器端收到了,返回确认信息,建立连接,数据传输完毕后释放连接。当客户端的第一次连接请求被服务器端接收到了,服务器以为是客户端又一次发送的连接请求,便返回信息要求客户端确认,而客户端会忽略掉这个信息,也不发送数据,此时服务器端一直处于等待客户端返回确认信息的状态,导致资源浪费。

3.继承与多态的区别

区别:

继承是子类使用父类的方法,是使用现有的类的属性创建一个新类,继承基本上是在类上实现的,支持OOP中重用性概念,提高了代码的复用性。继承有多种形式,有单继承、多继承、多级继承、层级继承和混合继承。

多态是父类使用子类的方法。根本上讲,多态是实现了多种形式的通用接口,多态基本上是在函数上实现的,允许对象在编译时或运行时调用某种形式的函数。多态可以是编译时多态或运行时多态。

4.不同数据类型的大小

类型win32/字节win64/字节
int44
int*48
char11
char*48
short22
short*48
float44
float*48
long48
double88
double*48

5.字节对齐求长度

union example {  
    int a[5];  
    char b;  
    double c;  
};  
int result_1 = sizeof(example);  
int result_2 = sizeof(test_struct);  

sizeof(结构体变量名):①看长度最长的是哪个,②看结构体中占用最大内存空间的类型,③将长度最长的那个扩充到占用最大内存空间的类型的整数倍即是最终结果。

result_1=24

sizeof(结构体对象名):遵循两个原则①起始地址是数据类型的整数倍,②是占用空间的大小是结构体中占用最大内存空间类型的整数倍。

result_2=32

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值