3次握手,4次挥手,IO等网络

一.三次握手

       (1)客户端要通知服务端,我要建立连接,发了一次请求

     (2)服务端收到请求,要告诉客户端,我收到你的请求了。发了一次ack

    (3)客户端收到信号后,要给服务端再发一次请求,不然服务端不知道客户端有没有收到它刚发的信息。

     这样之后,双方都会建立资源,然后开始数据传输

 

可以看到下图,请求百度的时候,前三次是建立联系,发送的数据length都是0,可以看到第二次ack是上一次请求seq+1

 

二.四次挥手

        (1)当客户端要断开连接时,给服务端发信息

        (2)服务端收到了,请求后,给客户端,说我收到你的请求了,给客户发了一个信息,ack,但这个时候还是可以发送数据的

        (3)当服务端把数据传完了,或者结束工作做完了,告诉客户端,可以断开连接了,发了一个信息给客户端

         (4)客户端收到服务端的信息后,返回一个ack,就断开连接了

 

三。网络数据传输过程

 

比如要访问百度

客户端在路由表中找到路由器的Mac,路由器找到运营商的mac,运营商根据ip找到百度的mac,然后j进行传输

 

 

四。IO相关

 

 

(1)最原始的CS解决方案

服务器进行监听,来一个客户换进行连接,内核自己调用read方法,进行阻塞,这样只有等第一个客户端释放,第二个客户端才能进行

 

为了解决上述read阻塞的问题

首先是内核不自己read了,每次来一个客户端都是新启动一个线程进行read,但这样有个问题,就是客户端多了,会创建很多线程,然后cpu的资源很多都浪费到切换线程上面。

 

 

内核发送了变化,文件描述符变成了非阻塞的。

为了解决多线程创建与切换的问题,每来一个客户端read不阻塞后,放入一个链表中,内核在去处理下一个客户端,然后只需要一个线程去while链表中read的状态就行,这种称为NIO

 

 

但是这种情况,有一个bi弊端,比如有10万个客户端,只有一个客户端发了消息,但还是要遍历链表,调用10万次内核的read的方法。

 为了减少read方法的调用,使用了select来解决,现在客户端不直接调用内核了,直接调用select,让select把10万个文件描述符拷贝到内核,内核遍历问客户端,得到需要调用的数量n,最后只用调用n次read方法。而不用调用10w次

 

但这个弊端是,客户端调用一次select,select都需要大量拷贝文件描述符的到内核,然后内核要遍历10w次。

 

epoll没听懂

 

 

参考:https://www.bilibili.com/video/BV1Sz411q7G5?p=5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章