![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习
花木狗
这个作者很懒,什么都没留下…
展开
-
Linux网络协议栈对数据包的处理过程
原帖地址:https://blog.csdn.net/yedushu/article/details/52588412?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BD%91%E7%BB%9C%E6%8A%A5%E6%96%87%E5%A4%84%E7%90%86%E8%BF%87%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2a原创 2020-07-21 17:02:23 · 728 阅读 · 0 评论 -
网络分层模型及作用
分层结构封装各层的作用1、物理层:比特主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。2、数据链路层:帧数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在计算机网络原创 2020-07-21 17:05:45 · 1955 阅读 · 1 评论 -
动态内存
1、存储区静态存储区和动态存储区统称为栈内存动态分配区域称为堆。动态分配区可以存放一些临时用的数据,不需要在程序声明部分定义,也不许要在函数结束时才释放,可以随时开辟,随时释放。该区域只能通过指针来引用。2、建立内存的动态分配这些函数全部在头文件stdlib.h文件中。(a)malloc()函数函数原型:void *malloc(unsigned int size);作用:在内存的动态存储区中分配一个长度为size的连续空间,单位为字节。返回值:函数返回值是所分配区域的第一个字节的地原创 2020-07-20 23:52:37 · 841 阅读 · 0 评论 -
选择、循环、控制语句
选择结构1、if语句(1)基本语法 if() do; else if() do; else{ do; }(2)逻辑运算符 && 与 if(a=1&&b=2) do; || 或 ! 非 ! > && > || 非的优先级最高。2、switch语句(1)基本语法switch(表达式){ case 常量1:do1;b原创 2020-07-20 21:30:42 · 178 阅读 · 0 评论 -
结构体
结构体的定义struct Student{ //struct Student就是结构体名 int num; char name[20]; char sex; int age; float score; char addr[30];}定义方式:struct 结构体名{ 成员列表 }; //成员列表也被称为域表定义结构体变量(a)先声明,后定义变量struct Student{ int num; char name[20]; char原创 2020-07-20 21:16:10 · 229 阅读 · 0 评论 -
c语言基本类型
常量类型整型常量实型常量:十进制小数形式指数形式:-123.456e-100字符型常量普通字符:‘a’、‘A’ 保存成ASCII码转义字符:P46字符串常量:“boy”、“123”符号常量用#define指令指定一个符号常量。#define PI 3.1415 //末尾没有;放在预编译行符号常量在预编译时,编译系统用值进行字符替换。预编译完成后,符号常量就不存在了,全部变为具体值了。变量变量代表一个有名字,有特定属性的存储单元在对程序编译连接时,编译系统给每一个变量名原创 2020-07-20 18:05:02 · 1430 阅读 · 0 评论 -
共用体和枚举类型
共用体类型定义:使用同一块内存(同一个内存起始地址),存放多个不同类型的变量。使用覆盖技术来实现共用体,但是需要注意的是,同一瞬时一个内存地址只能存放一种变量,共用体变量中只能存放一个值,否则就会被覆盖。共用体变量中起作用的是最后一次(最近一次)被赋值的概念。定义union 共用体名{ 成员列表}变量列表定义方式类似于结构体。举例:union Data{ int i; char ch; float f;}a,b,c;等价于:union Data{ int i; char原创 2020-07-20 17:52:56 · 423 阅读 · 0 评论 -
typedef
typedef使用方法先按定义变量的方法写出定义体(int *p);将变量名换成新类型名;(int *Pointer)在前面加typedef;(typedef int *Pointer)用新类型名定义变量。(Pointer p1,p2)一般将新类型的首字母用作大写,来区别。typedef命名新类型使用举例:用于基本类型typedef int Integer;Integer i; 等价于int i;用于结构体typedef struct{ int month; int原创 2020-07-20 17:46:53 · 164 阅读 · 0 评论 -
size_t和ssize_t
size_t和ssize_t都是用来描述多少字节的。但是有不同的区别size_tsize_t是为了增强程序的可移植性而定义的,在不同系统上,size_t的定义不同。他的大小和系统的位数有关。它是用来表示一个结构或一个数据占据多少字节的一个单位。32位系统上:size_t是unsigned int,是32位无符号整型。占个4字节;64位系统上,size_t是unsigned long,是64位无符号整型,占8个字节。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作原创 2020-07-20 17:32:54 · 1722 阅读 · 0 评论 -
HTTP协议
(1)什么是HTTP协议HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种网络传输协议。它基于TCP/IP通信协议来传递数据,数据报括HTML、图片、查询结果等等。HTTP协议工作在客户端-服务端结构上;客户端一般将用户浏览器作为HTTP客户端。浏览器通过URL向HTTP服务端发送请求。服务端HTTP服务端也就是WEB服务端,包括Apache服务器、IIS服务器等。WEB服务端收到客户请求后,回复响应。浏览器展示服务端响应内容,例如HTML页面,文件、原创 2020-07-19 21:24:59 · 737 阅读 · 0 评论 -
DHCP协议
DHCP协议(1)概念DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的原创 2020-07-19 15:40:32 · 210 阅读 · 0 评论 -
链表
链表链表有一个头指针变量。该变量指向一个元素,即结点。每个结点包括两个元素,一个是实际存储的数据,一个是一个指针变量,该指针变量指向下一个结点。(*p).==p->对于链表来说,一般可以用一个结构体指针来指向头结点。此后所有的节点和数据都可以使用->来引用。静态链表struct Node{ int num; struct Node *next;};int main(){ struct Node head,a,b; head.num=0; head.next=&原创 2020-07-18 21:11:21 · 138 阅读 · 1 评论 -
c语言的变量
变量的存储方式静态存储:在程序运行期间,由系统分配固定的存储空间全局变量全部是静态存储。程序开始时给全局变量分配存储空间,结束时释放。动态存储:在程序运行期间,根据需要进行动态的分配存储空间方式。一般在函数调用前后分配和释放。a、函数形参,在调用前没有存储空间,调用时分配存储空间。b、函数中定义的没有用static声明的变量;c、函数调用时的现场保护和返回地址。存储类别的定义(1)C语言存储类别有4种:auto: 局部变量默认为auto,即动态存储。static: 用于局部变量原创 2020-07-18 21:07:24 · 503 阅读 · 0 评论 -
const关键字
const关键字在c语言中由于广泛使用指针,因此可能稍有不慎就会造成程序崩溃。使用const关键字可以对传入参数进行保护。const关键字用于将一个变量声明为只读,也就是常量。无法被修改。也就是所谓的常变量。const修饰数组用const修饰数组声明一个数组常量,是对数组中数据的保护。const修饰的数组中的内容不能被改变。但是需要注意的是,const修饰数组还是不能保证安全的。使用某个指针指向这个数组,可以通过这个指针来修改数组中存储的内容。const 基本类型 数组名[];int m原创 2020-07-18 21:03:32 · 155 阅读 · 0 评论 -
指针
概念理解int a=1;int *pointer_a=&a; //pointer_a=&a;(1)地址和指针的定义内存区中每一个字节都有一个“编号”。地址包括一个编号信息和一个数据类型信息。C语言中地址=位置信息(纯地址)+所指向数据的数据类型=指针=&a指针就是一个变量的地址,只能用&获取。(2)指针变量定义指针是一个地址,指向存储变量的内存空间所在,带数据类型。指针变量是存放该指针(地址)的变量。(3)指针变量定义a、一个完整的地址&a,原创 2020-07-18 20:57:22 · 310 阅读 · 0 评论 -
FILE文件和标准IO
文件分类文件根据数据的组织形式,分为ASCII文件和二进制文件。内存中数据直接输出到外村,则是二进制文件(映像文件);在存储前转换为ASCII码,则为文本文件(text file)。文件缓冲区文件的输入输出都要经过文件缓冲区。每个文件会在内存中的分配一个文件缓冲区。输入输出共用该缓冲区。读入时:系统一次从磁盘中文件读入一批数据到内存中的文件缓冲区,然后从缓冲区逐个地将数据送到程序数据区。输出时:程序将数据先输出到文件缓冲区,等到缓冲区装满后,再输入到磁盘中。文件类型指针每个被使用文件原创 2020-07-18 20:29:58 · 483 阅读 · 0 评论 -
gcc编译参数
gcc编译gcc main.c -o main.out //编译成指定的名字gcc main.c -o ./out/main.out //编译成指定名字并保存到已存在文件夹,必须存在,不然报错gcc链接库gcc在链接库时主要有三种方式:1、默认情况默认情况下,gcc在编译时:头文件搜索目录为:/uer/include ---> /usr/local/include库文件搜索目录为:/usr/lib ----> /usr/local/lib默认链接的库文件:l原创 2020-07-18 19:52:30 · 142 阅读 · 0 评论 -
头文件与库文件
函数的声明和定义,编译过程声明:让编译器知道函数的名字,参数,返回类型。可以不存在。一般需要在函数使用之前,一定要先声明,再使用。定义:函数的定义就是函数的具体实现。编译过程:c语言的编译过程是:预处理(需要头文件)---->编译---->汇编----->链接(需要库文件)事实上头文件和库文件没有直接联系,头文件的作用就是告诉编译器,函数如何调用和返回,具体调用在链接阶段完成。#include两种include#include<xxxx.h> //编原创 2020-07-18 19:46:31 · 1127 阅读 · 0 评论 -
ARP协议
ARP:地址解析协议(1)什么是ARPARP是IPv4中必不可少的协议。OSI模型将网络工作分为7层,最底下三层分别是物理层、链路层(MAC)、和网络层(IP)。其中IP层(指IPv4)为32位,mac地址为48位。通过网络发送数据包时,首先封装第三层(IP地址)报头,然后封装第二层(MAC地址)报头。但是在我们发送时,只知道IP地址而不知道mac地址,所以需要用到ARP协议。通过该协议,将网络层IP数据报报头中IP地址解析出目标硬件地址(MAC地址)。ARP协议是网络层和链路层的重要枢纽。(2)A原创 2020-07-18 19:53:16 · 380 阅读 · 0 评论 -
IO模型
一个输入操作包括两个阶段:(1)等待数据准备好(2)从内核向进程复制数据对于套接字输入来说,第一步是等待数据从网络中到达,当所等待分组到达时,它被复制到内核中某个缓冲区;第二步是把数据从内核缓冲区复制到应用进程缓冲区.阻塞式IO默认情况下,所有IO都是阻塞式的recvfrom作为一个阻塞式IO,系统调用直到数据报到达,且被复制到应用进程的缓冲区中或返回错误才返回。非阻塞式IO模型进程把一个套接字设置成非阻塞是在通知内核:当所请求的IO操作要把本进程投入睡眠才能完成时,不要把本进程投入睡眠原创 2020-07-18 19:53:49 · 105 阅读 · 0 评论 -
网络编程常用数据类型
POSIX数据类型符合POSIX(可移植操作系统接口)的结构需要至少3个字段:sin_family、sin_addr和sin_port。POSIX定义的常见数据类型: size_t(字节的单位)size_t是为了增强程序的可移植性而定义的,在不同系统上,size_t的定义不同。他的大小和系统的位数有关。它是用来表示一个结构或一个数据占据多少字节的一个单位。32位系统上:size_t是unsigned int,是32位无符号整型。占个4字节;64位系统上,size_t是unsigned long原创 2020-07-18 19:53:55 · 369 阅读 · 0 评论 -
linux安装wireshark
1、sudo apt-get install wireshark2、wireshark安装完成后,选择选项为yes,如果选错,后期再改。默认为no,修改为yes即可。3、重新修改为yes:sudo dqkg-reconfigure wireshark-common选择为yes4、修改用户权限:sudo vim /etc/group在最后的wireshark中,添加客户名billy...原创 2020-07-18 19:54:23 · 1708 阅读 · 0 评论 -
TCP套接字编程实例
客户端程序#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#include<strings.h>#include<arpa/inet.h>#include<string.h>#include<errno.h>int main(){ p原创 2020-07-18 19:54:29 · 349 阅读 · 0 评论 -
8_批量输入与shutdown函数
批量输入客户端发送数据后,需要等待一段时间才能收到服务器回复信息。这段时间是RTT(往返时间,round-trip time,RTT)加上服务器处理的时间。假设RTT为8个时间,应答时刻在时刻4发出,时刻7接收到。之前程序的停-等通信方式如下图所示。由于管道是全双工的,所以在这种停-等方式中,仅仅使用了管道容量的1/8。在交互式输入中是合适的。但是如果用文件代替标准输入,会发现请求和回复的不对等。这是批量方式造成的。在批量传输的情况下,时刻7管道是充满的。假设我们的请求连续不断地发送,一直发送到最原创 2020-07-18 19:54:47 · 167 阅读 · 0 评论 -
7_IO复用与select函数
IO复用TCP客户同时处理两个输入:标准输入(从键盘读入数据)和TCP套接字(读写套接字)。加入当客户阻塞于标准输入fgets时,服务器进程被杀死。此时服务器TCP给客户发送一个FIN。但是因为客户此时正阻塞于标准输入,所以不能及时读到这个FIN(还在套接字中)。一直到标准输入结束,到读套接字时,才知道服务器结束。这会导致时间的浪费。对于IO复用来说,我们可以给进程指定一个或多个IO条件,内核一旦发现这些条件就绪(例如输入已准备好被读取,或描述符已能接受更多输出),就会通知进程。IO复用一般用sele原创 2020-07-18 19:54:55 · 204 阅读 · 0 评论 -
6_TCP套接字编程函数总结
套接字地址结构(1)IPv4的套接字地址结构 #include<netinet/in.h> struct in_addr{ //定义该结构来表示IPv4地址 in_addr_t s_addr; //32位IPv4的地址 }; struct sockaddr_in{ //套接字地址结构 uint8_t sin_len; //1字节,表示整个结构的长度=16字节 sa_family_t sin_family; //1字节AF_INET,表示是IPv4原创 2020-07-18 19:55:01 · 188 阅读 · 0 评论 -
5_POSIX信号处理
信号的概念信号就是告知某个进程发生了某件事的通知,也可以称为软件中断。信号一般是异步的,进程预先无法知道信号发生的时间。信号的发送方:可以是一个进程发给另一个进程;也可以是内核发送给某个进程。UNIX系统信号的类型见UNIX环境高级编程P251.信号的处置每个信号都有与之关联的处置,也被称为行为(action)。可以通过sigaction函数,来设定对一个特定信号的处置方式。信号的处置方式一般有三种:(1)忽略信号将某种信号的处置设定为SIG_IGN。大多数信号采用这种方式进行处理。但是原创 2020-07-18 19:55:07 · 194 阅读 · 0 评论 -
4_常用网络IO函数
文件描述符在linux下,一切都是文件。文件描述符是内核为了高效管理已经被打开的文件所创件的索引。它是一个非负整数int fd,用于指代被打开的文件。所有执行IO操作的系统调用都是通过文件描述符来完成的。(1)文件描述符和FILE的区别open、creat等低级IO函数返回文件描述符。不采用缓冲区去写,依赖操作系统功能对文件读写,不设文件结构体指针,只能读写二进制文件。区别于fopen等高级IO函数。fopen等高级IO函数返回的是一个指向文件FILE类型的指针,它们采用缓冲文件系统。在内存为每个文原创 2020-07-18 19:55:38 · 240 阅读 · 0 评论 -
3_基本TCP套接字编程
函数总结基本TCP客户服务器程序用到的套接字函数下图展示一个基本的迭代TCP服务器调用函数过程。socket函数执行网络IO时,进程的第一件事就是调用socket函数,指定期望的通信协议类型。(a)函数原型:#include<sys/socket.h>int socket(int family, int type, int protocol);(b)参数:int family:指明协议族类型,协议族类型共有:int type:指明套接字类型int protocol原创 2020-07-18 19:55:31 · 337 阅读 · 0 评论 -
2_地址和字节相关函数
IPv4和IPv6的地址ASCII表示IPV4:定义的最大长度#define INET_ADDRSTRLEN 16ddd.ddd.ddd.ddd’\0’例如111.111.111.11143个ASCII码表示的十进制数加上3个冒号。最大43+3+1=16字节。IPv6:#define INET6_ADDRSTRLEN 46内嵌IPv4地址法,为了兼容IPv4和IPv6HHHH.HHHH.HHHH.HHHH.HHHH.HHHH.ddd.ddd.ddd.ddd64个ASCII码表原创 2020-07-18 19:55:26 · 330 阅读 · 0 评论 -
1_套接字地址结构
套接字地址与套接字地址结构套接字是网络通信的主要手段,每一个套接字都需要一个参数,机套接字地址。套接字地址是IP地址和端口号的总和。个协议族(IPv4,IPv6)都定义了自己的套接字地址结构。这些结构的名字均以sockaddr_开头,不同的协议族有不同的后缀。在构造套接字(调用套接字函数)时,需要一个指向某个套接字地址结构的指针作为参数。套接字地址:IP地址+端口号套接字地址结构:不同协议族专门定义的一种结构体,用来表示套接字地址。IPv4的套接字地址结构定义在<netinet/in.h&g原创 2020-07-18 19:55:46 · 1365 阅读 · 0 评论 -
配置unp源码及运行程序遇到的问题
1、下载unix网络编程的源代码包,然后:tar -zxvf unpv13e.tar.gz 解压2、cd unpv13e,先修改文件操作权限:chmod u+x configure3、运行:./configure加粗样式4、接下来开始各种make编译5、进入lib:cd libmake得到静态库文件libudp.a6、进入libfreecd …/libfreemake此时出现问题查看后发现时inet_ntop方法中的参数size的类型,与声明在/usr/include/a原创 2020-07-18 19:56:01 · 471 阅读 · 0 评论 -
端口号与套接字对
端口号(1)端口号的定义个分类任何时候,多个进程可以同时使用TCP、UDP、SCTP中的任意一种传输协议,但是不同的进程使用的端口号(16位整数)不同。不同的服务器规定了传输协议使用的不同的端口号,尽可能地规定相同的端口号分配给TCP、UDP、SCTP的同一个给定服务,例如FTP服务器,TCP、UDP、SCTP都是21.以上所说的都是服务端的端口号。对于服务器来说,ip地址就是服务器的所在地址,端口号区分服务器提供的不同服务。可以用客服电话来理解,对于中国移动来说(某个服务器),他的电话10086就是原创 2020-07-18 19:56:08 · 1299 阅读 · 0 评论 -
TCP、UDP的输出
TCP输出每一个TCP套接字都有一个发送缓冲区。可以使用套接字选项SO_SNDBUF来更改该缓冲区的大小。当某个进程调用write时,内核从该应用进程的缓冲区中复制所有数据到所写的套接字缓冲区中。(1)写入如果套接字缓冲区容量不够,该应用进程会进入睡眠。此时内核不会从wirte系统调用返回,直到应用进程的数据全部写完。write调用返回成功,说明原来的应用进程缓冲区可以重新使用了。这与UDP不同。UDP的write返回成功,证明数据已经加入输出队列。(2)封装发送TCP提取套接字缓冲区中的数据准备原创 2020-07-18 19:56:14 · 368 阅读 · 0 评论 -
TCP的连接、断开与状态转移
TCP提供的功能连接:TCP提供客户与服务器之间的连接。传输之前需要先建立连接关系。 重传:TCP是可靠的,这与UDP不同。收端收到数据需要返回确认。如果没有收到确认,TCP会进行自动重传,并等待更长时间。数次重传失败后,TCP会放弃连接,并通知用户。RTT:TCP会自动估算客户和服务器之间的往返时间,将这个时间用于等待确认。由于往返时间的不稳定,TCP会持续估算一个给定连接。排序:TCP给每个字节关联一个序列号,并根据这个序列号对字节进行排序。假设一个应用写2048个字节到一个TCP套接字原创 2020-07-18 19:56:20 · 911 阅读 · 0 评论