当前课程知识点:互联网体系结构 >  第三周:TCP协议与Linux内核 >  TCP协议源代码分析 >  Video

返回《互联网体系结构》慕课在线视频课程列表

Video在线视频

Video

下一节:外部链接

返回《互联网体系结构》慕课在线视频列表

Video课程教案、知识点、字幕

我们对TCP协议有了有了一个初步的认识

然后呢

我们又对linux内核的源代码呢

大概的结构有了一个了解之后,我们就可以来分析TCP协议栈源代码了

对吧我们可以读一读

他在TCP协议栈的源代码

我们可以看一下他的就是主要集中net目录下的IPv4目录下啊

有没有定义了哦

也就是说

我们socket接口

用户态socket调用connect的时候呢

在socket接口层内核里面他就会调用这个connect函数指针

那同样的在服务器端的

这是在客户端在服务器端呢

我们在调用accept的时候

他同样也是调用了这么一个accept的指针

它对应的接口函数呢

因为我们在创建socket的时候

我们指定了就是协议栈

我们指定的是TCP协议栈

那么它对应的接口就会初始化成TCP

TCP协议栈里面connect的是TCP v4 connect函数

实际上这个函数指针就会调用到他那个accept

他就是inet csk accept这个函数

这个调用的函数指针的时候实际上就会调用这个函数

恩在创建那个socket套接字描述符的时候呢

这个sys socket他的内核函数呢

会指定这个协议的类型

比如说就是我们这

inet就是TCP/IP协议

sock stream就是这个TCP

我们就指TCP

但他会把我们这个TCP的代码的就是函数给挂载上去

除了就是TCP的协议的访问接口

还有在TCP协议的初始化工作

我们记得就在那个net目录下

IPv4 tcp.c中有的关键工作

如TCP

tasklet

init对吧

初始化了具体发送字节流进行滑动窗口管理的tasklet

因为这相当于内核线程

tasklet内核里面,这里来我们简单理解

简单了解一下

我们在看TCP的三次握手的源代码

我们可以从用户程序的角度来看

客户端connect和服务端accept

建立起了连接是背后完成的工作

背后完成工作都是在内核里面完成的对吧

但是因为connect之后accept

那就会收到在服务端accept

就会收到这个连接请求

就是accept

那么在内核那就是在那和socket接口层的

这个socket api函数对应的sys connect

和sys accept函数进一步对应着

也就是刚刚我看到的connect和accept这两个函数指针

TCP协议中的这两个函数指针对应着这个connect,刚刚看到了分析到这里了

你应该能够想到我们通过MenuOS的内核调试环境

可以设置断点来跟踪

tcp v4 connect函数和就是inet csk

accept函数来进一步验证三次握手的过程

我们再具体来看一下TCPV4 connect函数

这个函数的主要作用就是发起一个TCP连接

建立TCP连接的过程的自然需要底层协议的支持

因此

当我们从这个函数可以看到它调用IP层的一些服务

因为在TCP是传输层

然后他的下一层就是IP层

比如它调用了这个

从名称上可以简单分辨

我们关注TCP层的事情

因为我们在研究TCP层,IP层的我们以后专门在研究

那我们还可以看到

但是在这个函数里面的他设置了一个状态

就是TCP sent

他也就是说他这里面有状态管理有这个实际发送SYN标志的那个TCP分段

具体来看tcp connect函数呢

我们可以看到

也就说在我们在读内核代码的时候

会大量看到函数指针的应用

但你追到这个函数指针的时候

后面用callin的方式

你就追不下去了

对吧追不下去

那就我们就需要找到这个函数指针在哪里给他初始化的

也就是我们用某一个函数赋给了这个函数指针

而实际上在TCP协议初始化的时候呢

我们就设定好了IP层

向上提供的发送接口叫

这个函数

这里的TCP协议栈通过就是调用这个函数指针来触发IP协议栈的代码来了

实际上就是调用了IP协议栈的

就是小伙伴可以把

这地方你可以搜一下

可以找到的,具体IP函数内部的实现呢

我们暂时先不追下去

因为因为IP层的,我们到IP层再研究,我们大致知道

我们还会再涉及了

这个inet csk accept

我们讲了TCP客户端进行connect了

那接下来呢

服务器端他有一个accept对吧

服务端呢

通过socket接口中最终调用到了这个函数

这个函数它会从请求队列中取出一个连接请求

如果队列为空的话

我们如果具体要看这个

这个函数的话

那么就是他就是一个无限的for循环

一旦有连接请求

则跳出循环返回一个new一个客户端的连接

一个连接

一个连接的套接字描述符

这个我们都可以追踪代码

具体来看

我们刚刚看到的只是connect发送了SYN

但是服务端怎么样接收SYN的呢

这地方我们只是通过这个accept

从已经建立的连接队列中选一个是取出来一个

就是与他通信

但是呢

我们并没有涉及到他的就是SYN标志位

在服务端是怎么样被接收到的对吧

怎么被接收到的

那么我们再来看

然后呢

对吧

那么

他的主要思路呢

接下来呢

我们需要换一个思路

我们这要具体看一下

我们就是找这个

inet init也就是TCP/IP协议栈初始化的函数的时候

我们应该如果你留心的话

为什么符合代码逻辑呢

因为底层接到了数据

他要通知不同的协议

因为接到数据一看

这个是TCP协议的

那么他就要调用TCP的

如果他是UDP了

他就要调用UDP的对吧

他是根据接收到的数据的协议类型来判断是哪一个对吧

但是在就是因为就是上层有很多种不同的协议对吧

所以呢

我们这地方呢

就是他

在定义的时候

他就是一个根据就是协议类型直接

而不是直接调用这样

那我们让这个代码更通用更符合逻辑

更通用

那我们对TCP协议来讲呢

我们可以找到对吧

这样accept才能从队列中拿出来

所以这是两个工作

也就是接收呢

发送是直接发送出去了

但接收

他分两步

底层代码调用我们TCP协议的这个,把这个连接请求建立了三次连接请求建立起来

然后放到一个等待队列里面

然后呢

上层调用accept对吧

然后

把咱把这个已经建立起来的

已经建立起三次握手的连接

再把它取出来

也就是有有了一个新的套接字描述符啊

他大致的过程就是这样

那TCP的就是发送和接收

我们就是这么两个函数

也就是发送

接收

那么三次握手过程中

然后建立连接请求后呢

这个accept代码会从队列中接收

正常数据的收发过程和关闭的过程的这些,都需要深入理解这个TCP协议的标准

里边的算法对吧

才能才能细致地读懂

我们这是以三次握手为例

当然就是close的过程

也很复杂

我们看这个复杂的状态

转换对吧

我们就这样

TCP协议相当复杂

我们一定要是带着问题去研究,我们研究三次握手

那么我们就以三次握手的大的思路,来跟踪他,来分析的对吧

来找到位置

不要试图把内核代码或者说这个协议栈彻底的搞清楚好吧

你已经彻底搞清楚

当然也可以就是

如果我们只研究TCP协议栈的话

那么你的就是主要工作就聚焦在TCP协议栈

那我们可以把他具体搞清楚

但是我们这个课程呢

可能时间有限

我们需要理解整个网络体系结构

所以呢

我们在这呢

都是带着目的找关键的位置

找关键点

互联网体系结构课程列表:

第一周:互联网概述

-课程内容简介

--Video

-网络协议基础

--Video

--Video

--Video

--Video

-上网浏览网页背后的网络通信过程

--Video

--Video

-实验环境安装配置

--Video

-网络相关命令

--Video

--Video

-本周作业

--外部链接

第二周:Socket网络编程

-编译、构建和调试

--Video

--Video

--Video

-Socket接口

--Video

--Video

-UDP范例代码

--Video

-TCP范例代码

--Video

-本周作业

--外部链接

第三周:TCP协议与Linux内核

-TCP协议概述

--Video

--Video

-Linux网络协议栈源代码简介

--Video

-Linux系统的编译、构建和调试

--Video

--Video

-TCP协议源代码分析

--Video

-本周作业

--外部链接

第四周:IP协议及路由表

-IP协议基础

--Video

-路由表

--Video

-路由转发举例

--Video

-IP协议栈源代码解析

--Video

-路由协议简介

--Video

-网络层数据传输路径解析

--Video

-本周作业

--外部链接

第五周:ARP协议及ARP缓存

-ARP协议基础

--Video

-ARP解析的过程

--Video

-ARP解析在网络传输过程中的作用

--Video

-ARP协议栈源代码解析

--Video

-本周作业

--外部链接

第六周:二层交换网络及转发过滤数据库

-以太网基础

--Video

--Video

-交换机的学习、转发和过滤数据库

--Video

-常见二层协议

--Video

-数据链路层在Linux网络协议栈中的一些关键代码分析

--Video

-本周作业

--外部链接

第七周:DNS协议及域名存储与解析

-DNS协议基础

--Video

-DNS域名的存储

--Video

-DNS域名解析过程分析

--Video

-本周作业

--外部链接

第八周:互联网架构设计背后的渊源

-互联网架构设计的最初动机与核心目标

--Video

-互联网架构设计的具体目标及背后重要权衡

--Video

--Video

--Video

-课程考核

--外部链接

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。