tcp的一些知识

一、一个http请求的简单流程

    当用户通过浏览器访问一个域名,会经过DNS域名解析服务器,解析给我们一个ip地址,然后就能拿到ip去访问要访问的服务器了,有些大型网站为了加速访问静态内容的访问,而使用了CDN(Content Delivery Network),也就是内容分发网络。CDN其实是一种网络缓存技术,把一些相对稳定的静态资源文件分发给离客户最近的终端服务器上。

二、http通信协议原理

    客户端和服务端是如何通信的?http协议是基于 tcp/ip 协议之上的一个应用层协议,涉及到网络协议我们需要知道OSI (开放式系统互联)七层网络模型和 TCP/IP 四层概念模型,OSI 七层网络模型包含(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)、TCP/IP 四层概念模型包含(应用层、传输层、网络层、数据链路层)、TCP/IP 五层概念模型包含(应用层、传输层、网络层、数据链路层、物理层)。

1. 请求发起过程中,在tcp/ip四层模型中做了哪些事情?

    首先,客户端发送请求,经过传输层,在http请求报文前添加一个tcp头,表示使用tcp协议进行传输。【这里还可以通过udp协议进行传输,只是这两种协议想对比而言,tcp协议比较可信安全,不会存在数据丢包等】,然后再经过网络层,在之前的基础上再加上一个ip头,ip是网卡在网络中的通讯【粗略】地址。然后再经过数据链路层,添加一个MAC头,表示这个数据包要发送到的网卡的【具体】地址,MAC是全局唯一的。然后经过物理层,将数据包转换为比特流进行传输。

2. tcp的三次握手协议以及四次挥手协议

    首先了解下位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

2.1 三次握手协议【建立连接】
  • 第一次握手: 客户端会发送一个标志位SYN=1的包,来告诉服务端要建立链接,同时还会发送一个初始序号 X ,保存在 包 头 的 序 列 号seq字段里。
  • 第二次握手: 服务端接收到请求后,会发送一个SYN=1,ACK=1,seq=y,ack=x+1来告诉前端,我接收到建立连接的请求,是否确认要建立连接。
  • 第三次握手: 客户端接收到服务器消息后,发送一个ACK=1,seq=x+1,ack=y+1,来告诉服务确认建立链接,当服务端接收到确认消息后就建立连接成功了。
2.2 四次挥手协议【关闭连接】
  • 第一次挥手: 客户端发送一个标志位FIN=1,seq=u来告诉服务器我要关闭连接
  • 第二次挥手: 服务端接收到请求后,不会马上关闭,因为可能还有些数据请求消息没有处理完,此时会发送ACK=1,seq=v,ack=u+1,来告诉客户端,我已经接收到你的消息了,但是由于请求消息没有处理完,需要等一会儿再关闭。
  • 第三次挥手: 当服务端准备好关闭连接了,会再次向服务端发送FIN=1、ACK=1、seq=w、ack=u+1,告诉客户端是否确认关闭连接。
  • 第四次挥手: 客户端接收到请求后会发送一个确认包,并进入TIME_WAIT 状态,等待可能出现的要求重传的 ACK 包。服务端接收到这个ACK包,就关闭了连接。
    注意:但是此时客户端还没有关闭连接。客户端经过等待了2个最大段生命周期后没有接收到服务端返回的ACK包后,这才将自己也关闭。
3.单工、半双工、全双工的概念
  • 单工: 数据传输只支持数据在一个方向上传输。
  • 半双工: 数据传输允许数据在两个方向上传输,但是在某一时刻,允许在一个方向上传输,实际上有点像切换方向的单工通信。
  • 全双工: 数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
  • TCP 是一个全双工协议

三、使用协议进行通讯

       tcp建立连接后,客户端就可以基于这个连接通道来发送和接收消息了,TCP、UDP 都是在基于Socket 概念上为某类应用场景而扩展出的传输协议。主要的 socket 类型为流套接字(stream socket)和数据报文套接字(datagram socket)。对于tcp通讯来说每个tcp socket内核中都有一个发送缓冲区和接收缓冲区。当服务端一直未调用socket的read方法,那么该数据会被一直缓存在接收缓冲区,read方法后会将缓存中的数据复制到用户的buff里。如果应用进程一直没有读取,那么 Buffer 满了以后,出现的情况是:通知客户端TCP 协议中的窗口关闭,保证 TCP 接收缓冲区不会移除,保证了 TCP 是可靠传输的。这个过程中涉及到了 TCP 的滑动窗口协议,滑动窗口(Sliding window)是一种流量控制技术。

四、io阻塞的原因

    通过socket.accept 去接收一个客户端请求,accept 是一个阻塞的方法,意味着 TCP 服务器一次只能处理一个客户端请求。当一个客户端向一个已经被其他客户端占用的服务器发送连接请求时,虽然在连接建立后可以向服务端发送数据,但是在服务端处理完之前的请求之前,却不会对新的客户端做出响应,这种类型的服务器称为“迭代服务器”。迭代服务器是按照顺序处理客户端请求,也就是服务端必须要处理完前一个请求才能对下一个客户端的请求进行响应。但是在实际应用中,我们不能接收这样的处理方式。所以我们需要一种方法可以独立处理每一个连接,并且他们之间不会相互干扰。这就涉及到了创建线程或者线程池的方式来应对这种方式,但是不管是创建线程还是线程池都存在一些弊端就是线程本身的处理个数是有限制的。

五、同步阻塞io(BIO)和同步非阻塞io(NIO)及异步非阻塞式IO(AIO)

  • BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

    常见的io多路复用方式有【select、poll、epoll】,都是linuxApI提供的io多路复用方式。

  • select:进程可以通过把一个或者多个 fd 传递给 select 系统调用,进程会阻塞在 select 操作上,这样 select 可以帮我们检测多个 fd 是否处于就绪状态。
    这个模式有二个缺点
  1. 由于他能够同时监听多个文件描述符,假如说有 1000 个,这个时候如果其中一个 fd 处于就绪状态了,那么当前进程需要线性轮询所有的 fd,也就是监听的 fd 越多,性能开销越大。
  2. 同时,select 在单个进程中能打开的 fd 是有限制的,默认是 1024,对于那些需要支持单机上万的 TCP 连接来说确实有点少。
  • epoll:linux 还提供了 epoll 的系统调用,epoll 是基于事件驱动方式来代替顺序扫描,因此性能相对来说更高,主要原理是,当被监听的 fd 中,有 fd 就绪时,会告知当前进程具体哪一个 fd 就绪,那么当前进程只需要去从指定的 fd 上读取数据即可另外,epoll 所能支持的 fd 上线是操作系统的最大文件句柄,这个数字要远远大于 1024【由于 epoll 能够通过事件告知应用进程哪个 fd 是可读的,所以我们也称这种 IO 为异步非阻塞 IO】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值