IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 网络和操作系统高频问题 -> 正文阅读

[系统运维]网络和操作系统高频问题

持续整理更新中
https://bbs.gameres.com/thread_842984_1_1.html

一、TCP为什么是三次握手?

  • 1、TCP是面向连接:双方需证明彼此有收发能力。第一次握手,客户端发送SYN连接请求,服务端收到后仅能判断客户端有发送能力;第二次握手,服务端发送ACK,证明服务端有接受和发送能力;第三次握手,客户端发送ACK包,证明客户端有接受能力
  • 2、防止失效链接传送给服务端:当客户端发送SYN包后,此包在网络节点发生滞留,在客户端重新发包建立连接并释放后到达服务端,服务端以为客户端的再次请求,向客户端发送ACK(二次握手包),假如非三次握手,此时服务端就建立连接并等待client的数据,但现在的client并没有此行为,不会理睬服务端的ACK。
  • 3、TCP是可靠的:TCP需要seq序列号来做可靠重传或接收,为避免连接复用无法分辨出seq是延时还是旧链接的seq,因此需要双方三次握手约定双方的ISN(初始seq序列号)。第一次握手,客户端发送自己ISN_C;第二次握手,服务端收到了客户端ISN_C,并发送服务端的ISN_S和确认ISN_C;完成二次握手后,服务端确认收到了客户端的,而客户端无法确认收到服务端的(客户端没发ack,服务端无法确认客户端是否确认收到了)。所以只有客户端->服务端是可靠的。

第2条,实际上客户端收到非期望的ACK包会发送RST报文中止连接
第3条,当连接断开重连后,TCP依靠ISN识别旧链接重发的包,确认机制是累加的,seq X的确认,表明seq X-1都被确认收到了

二、为什么建立连接是三次握手,关闭连接却是四次握手?

因为建立连接的二次握手时,服务端把SYN和ACK一起回复。但是关闭连接时,当Server端收到FIN报文时,Server端的报文可能并没有发完,此时又要回应客户端FIN报文,所以先回复一个ACK报文表明收到, 然后等到Server端报文都发送完了,才发送FIN报文。因此不能一起发送。故需要四步握手。

三、一次访问网页的过程

四、BIO、NIO、AIO

https://zhuanlan.zhihu.com/p/152247738
BIO例子【多个线程处理业务】

func main(){
	listen, err := net.Listen("tcp", "0.0.0.0:4000")
	if err != nil {
		log.Fatal(err)
	}
	defer listen.Close()
	for {
		socket, err := listen.Accept()  // 2. 接收请求返回套接字(阻塞)
		if err != nil {
			log.Fatal(err)
		}
		go process(socket)  // 3.处理请求
	}

NIO例子(由java例子改造,仅供理解不可运行)【一个线程处理多个业务】

type SocketChannel struct{
	socket net.Conn
	schannel chan
}
func(s *SocketChannel)Bind(proto, addr string) (sc *SocketChannel, err error) {
	listen, err := net.Listen(proto, addr)
	if err !=nil{
		return nil, err
	}
	s.socket = listen
	schannel = make([]net.Conn, 0, 10)
	go func(){
		for{
		socket, err := listen.Accept()  // 2. 接收连接放进管道
			if err == nil && socket !=nil{
				s.schannel <- socket
			}
		}
	}()
	return
}
func (s *SocketChannel)Accept() net.Conn {
	select{
	case c := <-s.schannel:
		return c
	default:
		return nil
	}
}
func (s *SocketChannel)Close() {
	s.socket.Close()
}

var socketArray = []net.Conn
func main(){
	sc, err := net.Bind("tcp", "0.0.0.0:4000")
	if err != nil {
		log.Fatal(err)
	}
	defer sc.Close()
	for {
		socket := sc.Accept()  // 接收套接字(非阻塞)
		if socket !=nil{
			socketArray = append(socketArray, socket)
		}
		// 遍历连接进行数据读取
		for i:=0;i<len(socketArray);i++{ // 主动轮询socket,可改链表存便于修改
			var buffer bytes.NewBuffer()
			io.Write(socketArray, buffer)
			if len(buffer) > 0 {
				fmt.Println("接收到消息", string(buffer))
			}else if len(buffer) == -1 {
				socketArray.Remove(i);  // 此处象征性移除,语法有错仅供理解
				fmt.Println("断开连接")
			}
		}
	}

Epoll的底层实现

epoll_create():调用linux系统的内核函数epoll_create()创建epoll实例
epoll_wait():调用linux系统的epoll_wait等待文件描述符epfd(epoll实例)的事件。当socket收到数据后,操作系统的中断程序调用回调函数会给epoll实例的事件就绪列表rdlist里添加该socket引用(这块是操作系统实现的),当程序执行到epoll_wait时,如果rdlist已经引用了socket,那么epoll_wait直接返回;若rdlist为空,阻塞进程。
epoll_ctl():处理事件绑定

中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。例如c/s通信中,s网卡收到客户端数据,将触发操作系统中断程序,将事件放进就绪事件列表rdlist

进程阻塞为什么不占用CPU资源

内核接收网络数据全过程

为什么Kafka吞吐量如此高

https://www.jianshu.com/p/16500d06846a

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:34:54  更:2021-08-30 12:35:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:49:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码