网络编程
文章平均质量分 70
古德jiò
这个作者很懒,什么都没留下…
展开
-
TCP传输机制
TCP与UDP的区别格式对比ARQ协议 ARQ协议(Automatic Repeat-reQuest),即自动重传请求,是传输层的错误纠正协议之一,它通过使用确认和超时两个机制,在不可靠的网络上实现可靠的信息传输。ARQ协议主要有3种模式:停等式(stop-and-wait)ARQ回退n帧(go-back-n)ARQ,选择性重传(selective repeat)ARQ停等式停等协议的工作原理如下:1、发送方对接收方发送数据包,然后等待接收方回复ACK并且开始计时。2、在等原创 2022-01-08 20:15:17 · 912 阅读 · 0 评论 -
epoll&reactor by C
udp的服务器,如何做多个客户端并发1、在数据上加一层协议来区分客户端。但这个前提是要数据先发先到?,但是udp并不支持。2、模拟tcp,在第一次recvfrom时,创建一个fd与相应的客户端对应。信号在进程中如何工作的:1、进程的信号集合如何保存:进程中专门有一块地方保存信号2、调用signal信号如何保存到进程里面3、信号如何发送,如何捕获...原创 2021-08-09 20:45:58 · 145 阅读 · 0 评论 -
UDP可靠传输(KCP))
在阅读本文之前,可以先阅读一下之前的文章,了解tcp是如何保证可靠传输的本文主要以KCP协议展开讲解,KCP是UDP可靠传输协议分片 链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为原创 2022-01-09 20:56:29 · 2458 阅读 · 0 评论 -
socket编程需要关注的点
网络编程关注的问题连接的建立通过三次握手,分两种情况:1、客户端连接服务器2、服务器连接第三方服务器int client = accept(listenfd, addr, sz);int connectfd = socket(AF_INET, SOCK_STREAM, 0);int ret = connect(connectfd, (struct sockaddr*)&addr, sizeof(addr));// 每一次调用socket相关函数,erron都会有相应的变化errn原创 2022-01-05 21:42:04 · 988 阅读 · 0 评论 -
posix api(TCP)与网络协议栈的联系
linux 下 posix api有哪些服务端1、socket2、bind3、listen4、accept5、recv6、send7、close客户端1、socket2、bind(可有可无)3、connect4、send5、recv6、close设置socket参数setsocketoptgetsocketoptsocket是什么 直译过来是插座,fd(文件描述符)是我们可以操作的,与之对应的有tcb(tcp control block),fd与tcb的生命周期相同原创 2022-01-06 22:43:03 · 1152 阅读 · 3 评论 -
http小记
http粘包现象如:客户端连续3次send 1k数据,并且每次发送间隔没有很明确(可以理解为每次发送间隔很短很短),会让服务器误以为客户端一次发送了3k的数据。因此服务器只会recv一次并且send一次返回给客户端,导致客户端只recv一次,与其send的次数不匹配。解决办法1、解析http数据,用\r\n\r\n进行区分(head中每一行都有/r/n,而head与body之间有一个空行,因此会有两个/r/n)2、在http的head中定义包的长度(content-length)sendfile原创 2022-01-05 20:25:01 · 223 阅读 · 0 评论 -
redis,memcached
网络io职责检测ioio函数本身可以检测io的状态(通过errno),但是只能检测一个fd对应的状态,io多路复用(select)可以同时检测多个io的状态;这两者的区别是:io函数可以检测具体状态(errno),但io多路复用只能检测出可读,可写,错误,断开等(fd_set)笼统的事件;select返回的错误fd_set可以通过getsockopt()了解具体错误是什么。操作io只能使用io函数来进行操作,操作方式分为阻塞io与非阻塞io阻塞io:如调用read(),就一直在等read()返回原创 2022-01-05 21:41:55 · 550 阅读 · 0 评论 -
百万并发服务器by c
epoll本身就能支持百万并发,本文是基于recator实现百万并发服务器(关于recator可以参考之前发布的博客)接下来解释一下结构体的作用: ntyevent结构体是用于存储单个fd(clientfd与listenfd)的相关内容,每一个clientfd对应一个客户端的连接,listenfd是监听一个端口的fd ntyreactor是recator结构体,其中包含epollfd与eventblock,epollfd是用于管理单个epoll的文件描述符(即epoll_create()出来的原创 2021-12-29 21:31:14 · 612 阅读 · 0 评论 -
用户态协议栈之TCP/IP设计
协议栈数据组成格式用户层:用户数据传输层:8个字节udp头+用户层网络层:20个字节的ip头 + 传输层链路层:14个字节的以太网头 + 网络层网卡(在链路层和物理层之间):将链路层数据经过DA转换,变成电信号/光信号以太网头#pragma pack(1)#define ETH_ADDR_LENGTH 6// 以太网的头struct ethhdr{ unsigned char h_dst[ETH_ADDR_LENGTH]; unsigned char h_src[E原创 2022-01-12 21:17:22 · 998 阅读 · 1 评论 -
websocket
websocket是什么是一个应用层协议,主要用于服务器主动推送数据给浏览器(不仅仅局限于浏览器)。如:浏览器请求登录csdn,csdn的服务器产生一个二维码信息给浏览器,浏览器显示二维码,通过微信扫描二维码,微信的服务器处理信息,然后去告知csdn的服务器哪个二维码被哪个微信扫描了,csdn服务器再主动发送用户相关数据给浏览器(csdn给浏览器发送消息是websocket在起作用),浏览器登录成功。自定义协议由tcp包本身的信息(如包的长度)和协议本身的信息(如版本号)组成协议格式1.建立连接原创 2022-01-04 21:05:21 · 710 阅读 · 0 评论 -
epoll实现原理
目录数据结构epoll如何确定就绪fdepoll提供的接口做的事情epoll的线程安全ET(边沿)与LT(水平)技术参考数据结构 epoll是由所有fd的集合和就绪fd的集合(可读可写fd)组成 其中,所有fd的集合是key-value的形式,key为fd,value为具体数据,由红黑树实现。对比hash、btree/b++tree、红黑树实现epollhash: 缺点:首先需要创建一个hash表,其中每个hash槽后面都跟一个链表。在创建epoll的时候需要考虑到hash表的大小要定义原创 2022-01-15 21:20:39 · 760 阅读 · 0 评论 -
TCP的慢启动与滑动窗口
目录TCP头tcp发送慢启动与拥塞避免如何判断数据包数量超出网络负载具体传输滑动窗口技术参考TCP头Source Port:源端口号(bind函数绑定的,若没有调用bind则随便绑定一个)Destination Port:目的端口号(listen函数监听的端口号)Sequence Number:记录字节数(初始值是随机值,溢出之后,从1开始)Acknowledgment Number:ack numheader length:头的长度的header length*4URG:紧急传输标志Ur原创 2022-01-13 20:31:56 · 1360 阅读 · 0 评论