C++八股文笔记:网络编程和原理

1.socket编程

  1. 网络框架:libevent、ace、muduo
  2. 服务器要对客户端socket传来的数据recv,在有N多客户端后,需要利用IO多路复用来检测某个socket是否有数据传入。
  3. IO多路复用实现方式:epoll、select、poll
  4. select(监控最大fd值,可读集合,可写集合,出错集合,轮循间隔时间)
  5. poll(fd集合,fd长度,轮循间隔时间)
  6. poll和select底层是一样的都是do_poll,在调用poll\select时将所有fd从客户空间复制到内核空间,然后循环遍历,检测就绪的集合。再从内核空间复制到客户空间。
  7. epoll作用于用户态的协议栈网络 IO 的管理,内核的poll无法管理用户态协议栈内的fd,所以需要协议栈本身完成管理。
  8. epoll(epoll_create,epoll_control,epoll_wait),调用epoll_create就创建了一个所有集合的根节点,调用一次epoll_control增加一个fd节点,epoll_wait将就绪的fd复制出来。一旦有数据进入协议栈,术中相关节点就会回调将该fd添加到就绪队列中。
  9. epoll_wait只取出就绪fd,一般情况下epoll比select速度更快,但由于epoll底层是红黑树,所以在IO口较少或多线程调用的情况下select比epoll更快一些。
  10. nio:非阻塞io ; bio: 阻塞io ; aio: 异步io ; reactor: 反应堆 ;
  11. bio:不适合做工程代码,没有数据时进程被挂起 ; aio:利用回调函数完成,一旦io准备就绪就开始调用,用于磁盘和文件,由于网络io数据过大触发不及,一般用epoll; nio: 没有数据也执行,但返回值不同。
  12. reactor:直接使用epoll_wait中的三个回调函数,libevent是reactor的一种实现方法。
  13. (一对一)客户端接口:socket、bind、connect、send、recv、close ;服务端接口:socket、bind、listen、accept、recv、send、close
  14. (N对一)一请求一线程\进程(N数量少时)IO多路复用

2.计算机网络原理

1.网络结构体系

  1. OSI体系结构:应用层、表示层、会话层、运输层、网络层、数据链层、物理层(国际法律标准)
  2. TCP/IP结构:应用层、运输层、网际层、网络接口层(事实标准)
  3. 原理体系结构:应用层、运输层、网际层、数据链层、物理层
  4. 应用层:我们直接接触的都是应用层,应用层只专注于为用户提供应用功能,不关心数据如何传输。当两台应用需要通信时,应用层只需要将数据传输给下一层传输层。
  5. 传输层:为应用层提供网络支持,其中有两个重要协议——TCP、UDP,传输层将数据分段后交给网络层。
  6. 网络层:网络层实现网络互连,将数据在各个网络之间传输,实际负责传输的是网络层,在网络传输层会给数据赋予一个IP作为去向下个网络的目标。
  7. 数据链路层:当数据需要跨网络传输时,就需要一个专门的层标识网络中的设备,让数据在一个链路上传输,主要负责链路级别的数据传输服务。
  8. 物理层:封装传输比特流的方式,屏蔽了传输媒介的差异,数据链路层只需要考虑本层的协议和服务。传输媒介:光纤、双绞铜线、同轴电缆等

2.HTTP

  1. HTTP:超文本传输协议,http可分为三个部分:超文本、传输、协议,运行于应用层用户态。
  2. HTTP响应请求过程:
    在这里插入图片描述
  3. 非持久性链接:非持久性链接每发送一次请求,都要新建一次TCP连接(三次握手),且是串行请求,增加的通讯开销。
  4. 持久性连接:任意一方没有明确提出断开连接,则保持TCP连结状态。
  5. HTTP报文格式:HTTP由三部分组成——起始行(描述请求或相应的基本信息)、头部字段(用key-value形式更详细说明报文)、消息正文(实际传输数据,不一定是纯文本,有可能是图片或者视频的二进制数据)。

3.TCP

  1. TCP基本认识:TCP是面向连结的、可靠的、基于字节流的传输层通讯协议。

  2. TCP面向连接:一定是一对一进行连接,不能像UDP一个主机向多个主机发送消息,因为实际通讯中是两台主机中的应用进程进行通讯。

  3. TCP可靠:TCP连接不管中间链路产生什么变化,一定能发送一个报文到达接受端。

  4. TCP基于字节流:TCP传输的消息是没有边界且有序的,多大都能传输,即使后面字节的信息已经提前接受到到了,也要等前一个字节的信息接受完成才能逐个交给应用层去处理,重复的报文会直接丢弃。

  5. UDP:UDP是一种利用IP提供面向无连接的通讯服务,UDP相当于主机直接与IP进行交流。

  6. TCP与UDP的区别:
    a.TCP是面向连接的传输协议,需要先建立连接。UDP是即刻传输,不需要建立连接;
    b.TCP一对一。UDP一对多;
    c.TCP是可靠交付数据,不丢失,不重复,无差错,按需到达。UDP尽最大努力交付,不保证可交付数据;
    d.TCP有拥塞控制和流量控制机制,可以保证数据传输的安全性。UDP没有,即使网络十分拥堵也不会影响UDP发送速率;
    e.TCP首部长度较长,会有一定的开销,首部在没有选择【选项】字段时是20个字节,使用以后会更长。UDP首部长度只有8个字节,开销小,且不会更改;

  7. TCP使用场景:FTP传输\HTTP\HTTPS

  8. UCD使用场景:包量较少的场景——DNS、SNMP、视频\音频等多媒体通讯、广播通讯

  9. TCP三次握手建立连接:
    第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

  10. 三次握手的原因:
    1.阻止历史重复连接的初始化
    2.三次握手才能同步双方的初始序列号
    3.避免资源浪费

  11. 四次挥手断开连接:
    第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。也就是客户端发出连接释放报文段(FIN报文),指定序列号seq = u,主动关闭TCP连接,等待服务器的确认。

    第二次挥手:服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = u + 1。接着服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。

    第三次握手:服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认。服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。

    第四次握手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。

    客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。

  12. 四次挥手的原因:
    客户端向服务端发送FIN仅代表客户端不再发送数据了,但客户端依然能接受数据,服务器接收到FIN报文后,发送一个ack报文,但服务端可能还有等待处理和发送的数据,等待服务端不发送数据了再发FIN报文给客户端表示同意关闭连接。

  13. timewait的时间是2MSL,因为MSL最大生存时间是MSL,超过这个时间的报文就会被丢弃,如果关闭方在2MSL时间内没收到确认ack就会触发fin重发报文。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值