| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> POSIX API与网络协议栈的实现原理 -> 正文阅读 |
|
[网络协议]POSIX API与网络协议栈的实现原理 |
创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 一、TCP和UDP分层? ? ? ? ?左边为学术对OSI模型的划分,右边是工业中代码对于应用划分。 二、TCP服务器层次划分?三、TCP协议头和IP协议头???????? ????????? ?四、TCP POSIX API和阶段划分? ? ? ? 1.API?? ? ? ? (1)服务器端API:socket(), bind(),listen(),accept(),recv(),send(),close(). ? ? ? ? (2)客户端socket(),bind(),connect(),send(),recv(),close(). ? ? ? ? (3)可选择API:setsockopt(),getsocktopt,fcntl() ? ? ? ? 2.TCP三个阶段? ? ? ? (1)建立连接 ? ? ? ? (2)传输过程 ????????(3)断开连接 ? ?五、TCP三个阶段讲解? ? ? ? 1.建立连接(三次握手)???????????????? ? ? ? ? (1) 三次握手,由客户端发起,在connect函数发起 ? ? ? ? (2)服务器端此时处于listen函数内,当服务器收到syn请求时,把数据保存到syn队列中(半连接队列)。 ? ? ? ? (3)当客户端发送过来ACK后,服务器把半连接队列中的节点移动(不是拷贝)到accept队列,次队列叫全连接队列。此节点叫做TCB控制块。 ? ? ? ? 以上过程被称为三次握手。 ? ? ? ? (4)在服务器调用accept函数,主要做两件事: ? ? ? ? ? ? ? ? 1>从全连接队列中取出一个节点 ? ? ? ? ? ? ? ? 2>根据节点信息生成新的fd(与客户端IO层的数据收发) ? ? ? ? (5)Listen函数主要是把fd的状态置位可三次握手的状态(TCP的11种状态相关) ? ? ? ? 异常说明: ? ? ? ? ? ? ? ? 1>在完成三次握手,服务器并没调用accpet出现情况是:客户端可以发送数据,并且可以发送成功,但是服务器收不到数据。 ? ? ? ? ? ? ? ? 2>TCB控制块的生命周期,是在listen函数之前此节点已分配,当close之后,此节点变为复用或者释放。 ? ? ? ? ? ? ? ? 3>TCB控制块,主要是fd的五元组 ? ? ? ? ? ? ? ? 4>listen第二个参数(backlog)的意义:指半连接队列的最大长度 ????????????????The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.? If a connection request arrives when? the? queue? is?full,? the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that?a later reattempt at connection succeeds. ? ? ??????????????第二个参数就是未完成队列的大小,listen的第二个参数。跟系统的链接数量没有任何关系。相当于设置一个瞬间能够处理的阈值。 The? behavior? of? the? backlog? argument on TCP sockets changed with Linux 2.2.? Now it specifies the queue length for completely established sockets waiting to be?accepted,? instead? of? the? number? of? incomplete? connection? requests.?? The? maximum? length? of? the? queue? for? incomplete? sockets?? can?? be?? set?? using ?/proc/sys/net/ipv4/tcp_max_syn_backlog.?? When? syncookies are enabled there is no logical maximum length and this setting is ignored.? See tcp(7) for more information. ?????????在linux 2.2以后? listen的第二个参数。指的是在完成TCP三次握手后的队列。即在系统accept之前的队列。已经完成的队列。如果系统没有调用accpet把这个队列的数据拿出来。一旦这个队列满了。未连接队列的请求过不来。导致未连接队列里的请求会超时或者拒绝。如果系统调用了accpet队列接受请求数据。那么就会把接受到请求移除已完成队列。 这时候已完成队列又可以使用了。 ????????一般情况下都会去开启 syncookie。所有其实现在已经可以不太关系listen的第二个值了 ? ? ? ? 2.数据传输过程? ? ? ? ? ? ? ? (1)接收数据? ? ? ? ? ? ? ? 举例:客户端发送1.2.3.4四个包到服务器,服务器只收到1.2.4 ???????????????? ? ? ? ? ?服务器在收到包时,发送对应的ack,开启定时器。当定时器到时间,协议栈会对收到收到的数据包进行排序,主要原理:保证最小包的顺序性,在丢了3号包之后,服务器会把4号包丢掉。客户端会重新发送3号和4号包。所谓的:超时重传 ? ? ? ? 缺点:ACK确认时间长,重发次数有点多 ????????(3)数据发送过程? ? ? ? ? ? ? ? ? ? ????????包的发送分为两个阶段: ? ? ? ? ? ? ? ? ?第一阶段(慢启动):第一次发1个包,第二次发2个包,第三次8个包,以2的指数方式增长发送数据包的个数,当达到门限值,进入第二阶段。 ? ? ? ? ? ? ? ? 第二阶段(拥塞控制):在第一阶段进入第二阶段后,发包数量按照固定的斜率增长,当发送数据包到达一定数据,发送数据包个数变为原来的一半,继续增长发送。主要是为了控制流量。 ? ? ? ? 3.关闭过程(四次挥手)???????????????? ? ? ? ? ?四次挥手服务器和客户端都可以发起。 ? ? ? ? ? 问题1:出现大量的time_wait? ? ? ? ? ? 原因:服务器端调用了大量的close函数引起 ? ? ? ? ? 解决:通过setsockopt选项设置TCB控制块可重用(reuse) ? ? ? ? ? ?问题2:出现大量的close_wait? ? ? ? ? ? ?原因:在recv返回0后,未及时调用close,大部分的原因是由于先处理应用数据,造成的。 ? ? ? ? ? ?解决:先调用close,然后再去处理和保存对应的业务数据 ? ? ? ? ? 问题3:出现大量的fin_wait_1或者2如何处理? ? ? ? ? ? 解决:kill程序,无法处理 六、TCP和UDP对比???????? ? ? ? ? ? ?1.协议头上的区别,OSI七层模型中传输层的差别。 ?????????2.UDP是无连接的,TCP是基于连接的,这里的连接是指三次握手和四次挥手???????? ? ? ? ? 3.API的区别send和sendto,recv和recvfrom。 ? ? ? ? 4.UDP是数据报传输,TCP是流传输。 ? ? ? ? 流式:先发先到,后发后到 ? ? ? ? 数据报:不保证顺序 七.UDP的高并发???????? ?服务器在收到客户端connect之后,客户端第一次发送数据后,服务器在收到数据后,会生成新的fd,从新的fd发送数据给客户端。 ? 客户端和服务器的真正连接,并不是connect,而是connect之后的第一次发送send才真的连接。 ? 客户端程序可以不调用connect |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/25 22:54:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |