| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> unix网络编程——网络基础 -> 正文阅读 |
|
[网络协议]unix网络编程——网络基础 |
一、传输控制协议(TCP)tcp是面向连接的的,他不可以被描述为100%可靠的协议,他提供的是数据的可靠传递或故障的可通知。它保证了数据的可以顺序到达、不重复、不丢包。tcp重要的是三次握手和四次挥手做了什么,每次响应和发送都代表了什么。基本的TCP编程模板如下图: ? 1.1 三次握手阶段SYN:表同步。 服务器端:执行socket创建监听套接字,使用bind函数来绑定存有端口与IP地址的结构体到socket,执行listen函数使服务端主动连接的socket转化为被动的socket,使这个socket可以等待其他socket的连接请求,再利用accpt函数从连接队列中取出连接请求,这里并不是建立了连接,如果连接队列为空的话服务端进入睡眠,如果执行成功的话返回一个非零的描述符用作后续信息传输的端口(已连接套接字)。 客户端:执行socket创建套接字,使用connect函数连接服务端,这里是主动打开。 三次握手的过程: 1、服务器执行了accpt后进入等待客户端接入的状态,此时是被动打开,而客户端调用connect后主动连接服务器,执行connect后进入阻塞状态(SYN_SENT),并且发送SYN包。 2、服务端收到客户端发送的SYN包后进入SYN_RECV状态并且回应客户端的SYN包,回应的是一个ACK包,他就是客户端SYN包加一,且发送一个自己的SYN包。 3、客户端接受到服务器的响应和服务器发送的SYN包进入数据传输状态(ESTABLISH),发送ACK响应包,内容就是服务器发送的SYN包加一。 4、服务器再接收到这个ACK包后也进入数据传输状态(ESTABLISH)。此时accpt返回一个已连接套接字,就可以开始通讯了。 1.2 数据传输阶段1.客户端使用write来进行数据请求。 2.服务器使用read得到客户端的请求,再使用write返回客户端需要的数据和请求ACK包。 3.客户端使用read读取服务端返回的数据并且给服务器发送一个应答ACK包。 注意点:有序列号所以不会重复发送,也不会乱序,更不会导致漏发。 具有流量控制,TCP总是告知对端他能够接受到多少字节的数据,不会导致接受缓冲区溢出。 1.3 四次挥手阶段1.客户端调用close函数主动关闭,进入FIN_WAIT_1阶段并发送FIN包。 2.服务端接受FIN包后进入CLOSE_WAIT状态,并返回一个ACK包(FIN+1)。 3.客户端接受到ACK包后进入FIN_WAIT_2状态。 4.服务端调用close函数进入LAST_ACK状态并发送一个FIN包。 5.客户端接收到FIN包后进入TIME_WAIT状态,并返回ACK包。 6.服务端接收到ACK后进入CLOSED状态,关闭连接。 整个过程如下图所示: 二、TIME_WAIT状态TIME_WAIT状态是客户端发送ACK包后的状态,此时他不会直接关闭,因为他发送的ACK包有可能在传输的过程中丢掉了,并不会被服务端所接受到,服务端有可能重新发送FIN包,如果客户端直接关闭会导致服务端一直反复发送FIN包等待结束。所以需要有TIME_WAIT这一状态,这个状态持续的时间为2MSL(MSL:任何IP包在intel网中存活的最长时间)。 所以TIME_WAIT的存在可以使TCP执行完整的关闭,允许老的重复的分节在网络中消逝。 三、常用结构体
sockaddr_in比sockaddr结构体好就好在IP和端口分开存储。? 四、recv与send的本质应用层函数recv、send与内核中套接字的真正读取数据,TCP协议层是运行在内核中的,二通信是网卡直接通讯,只要对方send,线路上就有数据,那么协议就会从网卡读取数据进入内核的socket缓冲区中,recv只是从socket内核中把数据拷贝到指定的缓冲区buf中,对协议毫无影响。 socket默认是全缓冲,如果没有setsocketopt的话,只有当socket内核缓冲区中的数据满了才会发送,通过网卡发送。send其实就是将应用层数据拷贝到socket的缓冲区而已,并不代表真正的数据发送。 五、主机与网络字节序(大小端问题)主机字节序:小端存储,数据的高位存放在终止地址,数据的低位存放在起始地址。 网络字节序:大端存储,数据的高位存放在起始地址,数据的低位存放在终止地址。 在网络的传输中需要利用两种字节序的转换函数来进行转换,这些函数可以自己找找看。我们也可以写个函数来判断系统是大端还是小端,代码如下:
? |
|
网络协议 最新文章 |
使用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/26 1:24:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |