Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1848771
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: 网络与安全

2018-05-20 17:15:53

最近读书读到TCP/IP详解第二卷以及UNP第一卷,感觉酸爽极了,不定时的会更新点心得体会,如果中间夹杂着些别的什么东东,各位看官,别在意,一定是我自己看英文书看眼睛花了,换换口味~~~(自己作的死,含着泪也要搞定)

言归正传,众所周知,在每一个进程的生命周期内,都会有一个对应的进程表实体与之对应,在这个进程表实体内,又保存着一组对应关系:文件描述符与文件指针。文件描述符不用多说了吧,文件指针指向内核当中维护的一张打开文件表中的某个实体,该表由内核维护,每一个打开文件表项中又存在一个指针,指向文件的vnode,他们之间的具体关系如下图所示。

如果是普通文件的话,这个略图就够用了,但是当调用socket函数,如:

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

生成套接字文件描述符时,情况就和通过open函数打开文件描述符有点不一样了,差别如下图所示(本图以udp socket为例):



其中f_ops那一部分的理解可以参考之前添加驱动的那篇文章:

http://blog.chinaunix.net/uid-31422160-id-5784373.html

在网络编程中,当我们创建好socket之后,我们就可以通过对文件描述符的操作来实现与远程主机进行通信了,根据我们学过的TCP/IP模型,这些数据是在应用层一路打包下来到物理层,经过网络,才能到达目的主机,在应用层打包往下传输数据的过程当中,mbuf结构就不得不提了~mbuf结构共有四种不同的类型,如下所示



四种不同类型的mbuf是根据两个变量的两两组合而来的,即是否为当前mbuf链的头,是否有外部存储。为什么会选择这两个变量呢?原因就是用户传入的数据不可能每一次都满足mbuf108字节,所以当超出这个数目的时候,就需要将数据进行分片,这样,针对每一次发送的消息,mbuf就自然而然的形成了一条链,来在内核中表示该消息。

当我们调用sendtoudp)的时候,用户进程就将目标的地址信息填入到mbuf头当中,填入数据之后一路往下传,就行了,这里先简单介绍一下比较简单的情况:使用udp发送80个字节的数据。

调用sendto之后,先将数据全部拷贝到mbuf的数据区,除此之外,还需要新建一个mbuf,来存放目标的地址,即各个协议的头,结果如下图所示:

注意,这里udp头和IP头和是逐个放在mbuf链表头数据区最底下的,这是为了更好地打包,下层协议只需要将自身得头放入其上就可以了~~
请各位看官多提宝贵意见~~顺便一提:
感觉聪明的“懒蛋”是改变这个世界的终极力量。。。

阅读(2574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~