网络编程必备:深入理解TCP/IP协议栈(含posix API实现)(下)

简介: 网络编程必备:深入理解TCP/IP协议栈(含posix API实现)

3.3FTP协议以及端口

文件传输协议FTP(File Transfer Protocol)是世界上使用最广泛的文件传输协议。FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限

网络环境下复制文件的复杂性:

  • 计算机存储数据的格式的不同
  • 文件的目录结构和文件命名的规定不同
  • 对于相同的文件存取功能,操作系统使用的命令不同
  • 访问控制方法不同

因此,FTP协议出现了。

FTP协议连接过程

  1. 打开熟知端口(端口号为 21),使客户进程能够连接上
  2. 等待客户进程发出连接请求
  3. 启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程
  4. 回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行
  5. 当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口 (21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接
  6. 接着,服务器进程用自己传送数据的熟知端口 (20) 与客户进程所提供的端口号码建立数据传送连接
  7. 由于 FTP 使用了两个不同的端口号,所以数据连接(20)与控制连接(21)不会发生混乱

FTP是使用了两个TCP连接的

  • 使协议更加简单和跟容易实现
  • 在传输文件时还可以利用控制连接(如:客户发送请求终止传输)

3.4DHCP动态主机配置协议

DHCP:DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。互联网广泛使用的动态主机配置协议 DHCP (Dynamic Host Configuration Protocol) 提供了即插即用连网 (plug-and-play networking) 的机制。

DHCP是使用UDP协议工作,他的用途如下:

  1. 为内部网络或网络服务供应商自动分配IP地址
  2. 为用户或者内部网络管理员作为对所有计算机做中央管理的手段
  3. 为内部网络用户接受IP租约

并不是每个网络上都有DHCP服务器,这样会使得DHCP服务器的数量太多了。现在是每个网络至少有一个DHCP中继代理,他配置了DHCP服务器的IP地址信息

在生活中,DHCP必不可少,为我们带来了便利,当通过WiFi连上一个陌生的子网,但是我们并没有做重新为主机配置IP地址的工作,这样子就可直接上网!假如没有DHCP协议的帮助:

而在DHCP协议的支持下:

DHCP工作流程

  • DHCP服务器管理着一个包含一系列IP地址的地址池
  • 每当一台新的主机加入时,DHCP服务器就从其当前可用地址池中分配一个任意的地址给它
  • 而每当一台主机离开的时候,其IP地址就被回收到地址池中

3.5简单网络管理协议SNMP

简单网络管理协议SNMP(Simple Net Manage Protocol)是TCP/IP协议簇的一个应用层协议,网络管理包括对硬件、软件和人力的使用、综合与协调,以便对网络资源进行监视、测试、配置、分析、评价和控制,这样就能以合理的价格满足网络的一些需求,如实时运行性能,服务质量等。网络管理常简称为网管。

含义:

  • 网络管理协议简称为网管协议。
  • 需要注意的是,并不是网管协议本身来管理网络。网管协议是管理程序和代理程序之间进行通信的规则。

CS模式:

  • 管理程序和代理程序按客户服务器方式工作。
  • 管理程序运行 SNMP 客户程序,向某个代理程序发出请求(或命令),代理程序运行 SNMP 服务器程序,返回响应(或执行某个动作)。

功能:

  • SNMP 最重要的指导思想就是要尽可能简单
  • SNMP 的基本功能包括监视网络性能、检测分析网络差错和配置网络设备等。

过程:

  • 整个系统必须有一个管理站。
  • 管理进程和代理进程利用 SNMP 报文进行通信,而 SNMP 报文又使用 UDP 来传送。
  • 若网络元素使用的不是 SNMP 而是另一种网络管理协议,SNMP 协议就无法控制该网络元素。这时可使用委托代理 (proxy agent)。委托代理能提供如协议转换和过滤操作等功能对被管对象进行管理。
  • SNMP 定义了管理站和代理之间所交换的分组格式。所交换的分组包含各代理中的对象(变量)名及其状态(值)。
  • SNMP 负责读取和改变这些数值。

3.6电子邮件协议SMTP、POP3、IMAP

SMTP是因特网电子邮件中主要的应用层协议,只用TCP可靠数据传输服务,SMTP的端口号是25号。因特网电子邮件的主要组成部分:

  • 用户代理(user agent)
  • 邮件服务器(mail server)
  • 简单邮件传输协议(Simple Mail Transfer Protocol )

邮件发送过程:从发送的用户代理开始,传输邮件到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。如果用户要读取该邮件时,使用用户名和口令来鉴别用户。

POP3(第三版的邮局协议Post Office Protocol - Version 3):

  • POP3是一个极为简单的邮件访问协议(由于其简单,所以权限有限)
  • 当用户打开了一个到邮件服务器的端口110上的TCP连接后,POP3就开始工作了,按照三个阶段:特许、事务处理以及更新

IMAP(因特网邮件访问协议Internet Mail Access Protocol):

  • 允许用户代理获取报文某些部分的命令
  • IMAP协议为用户提供了创建文件夹及移动文件的命令

注意:

  • 不要将邮件读取协议 POP 或 IMAP 与邮件传送协议 SMTP 弄混。
  • 发信人的用户代理向源邮件服务器发送邮件,以及源邮件服务器向目的邮件服务器发送邮件,都是使用 SMTP 协议。
  • 而 POP3 协议或 IMAP 协议则是用户从目的邮件服务器上读取邮件所使用的协议。

四、网络层协议

IP协议属于网络层协议,所有的TCP, UDP, ICMP, IGMP数据都通过IP数据报传输。IP提供了一种不可靠,无连接的数据包交付服务。依赖其他层的协议进行差错控制。不可靠: IP数据报不保证能成功的到达目的地,如果出现错误则选择丢弃该数据,然后发送ICMP消息报给信源端 无连接: IP不提供任何后续数据报的状态信息,每个数据报处理都是独立的。如果一个信源发送了连续的两个数据报,每个数据报选择独立的路由,两个数据可能不同时到达。IP通信双方都不长久地维持对方的任何信息。这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

4.1ipv4数据报

1.版本号:占四位,就是IP协议的版本,通信双方的IP协议必须要达到一致,IPv4的版本就是4.

2.首部长度:占四位,因为长度为四比特,所以首部长度的最大值为1111,15,又因为首部长度代表的单位长度为32个字(也就是4个字节),所以首部长度的最小值就是0101,当然,也确实如此,大部分的ip头部中首部字节都是0101.也就是5*4=20个字节,如果是最大值15的话,ip首部的最大值就是60个字节,所以记好了,ipv4首部长度的最大值就是60,当然当中我们又能发现,IPv4的首段长度一定是4字节的整数倍,要是不是怎么办呢?别急,后面的填充字段会自动填充补齐到4字节的整数倍的。

3.区分服务:这个没有什么用处,也没有什么好讲的了,只要自动这玩意占八位,一个字节就可以了。

4.总长度:占16位,这个的意思就是ip数据报中首部和数据的总和的长度,因为占16位,所以很好理解,总长度的最大值就是2的16次方减一,65535,这玩意也对应着还有一个很简单的概念,最大传输单元mtu,意味着一个IP数据报的最大长度就只能装下65535个字节,要是传输的长度超过这个怎么办,很简单,分片。

5.标识:占16位,标识这玩意很好理解,IP在存储器中维持一个计数器,每产生一个 数据报,计数器就加1,并将此值赋给标识字段。但这个标识并不是平常的序号,因为IP是 无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分 片时,这个标识字段的值就被复制到所有的数据报片的标识字段中,等到重组的时候,相同标识符的值的数据报就会被重新组装成一个数据报。

6.标志:占三位,一般有用的是前两位, 最低位叫做MF,MF=1表示后面还有若干个数据报,MF=0表示这已经是最后一个数据报了。中间位叫做DF,DF表示不能进行分片,DF=0才可以进行分片操作。

7.片偏移:占13位,片偏移就是,在原来的数据报分片以后,该片在原分组中的相对位置,片偏移中的基本单位是8字节,所以,也就是说,只要是分片,每个分片的长度都是8字节的整数倍,最后一个分片不够八字节的一样是填充。

8.生存时间ttl:占8位,(time to live),表明数据报在网络中的寿命,这个值被设定成跳数,顾名思义,就是这个数据报可以经过多少个路由器的数量,每经过一个路由器,该值就减一,减到为零的时候就被抛弃,显而易见,这个跳数的最大值就是2的8次方减一,255.

9.协议:就是用来指明数据报携带了哪种协议,占8位。

10.首部效验和:占16位,这个字段用来效验数据报首段,下面给出简单的计算方法:

首先在发送端的时候,将效验和全部置为0,然后把数据报首段数据全部进行反码相加,得到的值为效验和,放入首段效验和里面,然后接收端将数据报首段数据和效验和一起全部反码相加,最后若是得到零,则保留,若是不为零,则说明数据报在传输的过程中发生了改变,则丢弃该数据报。

11.IP源地址:占32位,将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。

12.目的地址:也占32位,转换方法和来源IP地址一样。

13.选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径 b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间 c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器 d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器 e. 上层协议(如TCP/UDP)的头部信息

13.到了可变部分IPv4的头部基本上就已经讲完了,增加头部的可变选项实际上就是增加了数据报的功能,可变选项在实际上是很少用到的。

4.2分片

当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。IP头部中的如下三个字段给IP的分片和重组提供了足够的信息:数据报标识、标志和片偏移。一个IP数据报的每个分片都具有自己的IP头部,它们具有相同的标识值,但具有不同的片偏移。并且除了最后一个分片外,其他分片都将设置MF标志。此外,每个分片的IP头部的总长度字段将被设置位该分片的长度。

4.3IP路由

路由是什么:我们知道,IP地址是网络世界里的门牌号。你可以通过IP地址访问远在天边的网站,那么数据是如何到达网站的呢?靠的就是路径上每个节点的路由。路由,简单的说就是指导IP报文该去哪的指示牌。

一般说来,主机会在以下两个时机进行路由查询

  • 1.收到报文时,查询路由决定是上送本机(LOCAL IN),或者从哪个出接口转发(FORWARD)
  • 2.本机发送报文时,查询报文出接口 注意,转发需要开启 net/ipv4/ip_forward

路由表长什么样 以一个典型的主机为例,tristan有一个外部网卡enp1s0和一个内部还回网卡lo。

通过route -n我们可以看到主机上简要的路由表信息(当然通过ip route也可以),那么上面的路由信息中的每一表项代表什么意思呢?

  • 如果报文的目的IP地址在164.69.136.0/24这个网段,那么它应该从enp1s0进行转发。
  • 如果报文的目的IP地址在169.254.0.0/8这个网段,那么它应该从enp1s0进行转发。
  • 其他情况下(0.0.0.0/0),报文从enp1s0转发,下一跳IP地址是192.168.99.254

4.4IP转发

当主机收到一个数据报时,首先检查目的地址:

  • 如果是自己(自己某一个接口所配置的IP地址或IP广播或者组播地址),则交给协议字段或者IPv6头部的下一个头部字段指定的协议模块处理。
  • 如果不是:
  • 如果IP层被配置为路由器,则转发该数据报。
  • 否则默默丢弃,必要时生成ICMP报文给发送者。

转发不会改变数据报的IP地址,只是通过设置链路层地址来完成交付的过程:

  • 发送者定义好源IP和目的IP,如果目的IP不在本地,则将链路层的目的MAC地址设置为路由器,由路由器代为转发。
  • 每一跳路由器在转发时,都会将源MAC地址设置为自己,目的MAC地址设置为下一跳路由器。

4.5IP地址介绍

ip地址组成 : IP地址由4部分数字组成,每部分数字对应于8位二进制数字,各部分之间用小数点分开 这是点分2进制 如果换算为10进制我们称为点分10进制.每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表示其属于互联网中的哪一个网络,而主机地址则表示其属于该网络中的哪一台主机。

A类地址:范围从0-127,0是保留的并且表示所有IP地址,而127也是保留的地址,并且是用于测试环回用的。因此 A类地址的范围其实是从1-126之间。  如:10.0.0.1,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。转换为2进制来说,一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.1 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1千多万个主机(2的24次方的-2主机数目)。以子网掩码来进行区别::255.0.0.0 127.0.0.0到127.255.255.255是保留地址,用做循环测试用的

B类地址:范围从128-191,如172.168.1.1,第一和第二段号码为网络号码,剩下的2段号码为本地计算机的号码。转换为2进制来说,一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。(2的16次方-2) 以子网掩码来进行区别:255.255.0.0 169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.0到169.254.255.255中临时获得一个IP地址。

C类地址:范围从192-223,如192.168.1.1,第一,第二,第三段号码为网络号码,剩下的最后一段号码为本地计算机的号码。转换为2进制来说,一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。(2的8次方-2) 以子网掩码来进行区别:255.255.255.0

D类地址:范围从224-239,D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。224.0.0.0-239.255.255.255 组播地址

E类地址:范围从240-254,以“11110”开始,为将来使用保留。全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。240.0.0.0-255.255.255.254 保留地址

子网掩码就是为了区分ip地址的中的网络号和主机号的。

私有地址 所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址 在A类地址中,10.0.0.0到10.255.255.255是私有地址 在B类地址中,172.16.0.0到172.31.255.255是私有地址。在C类地址中,192.168.0.0到192.168.255.255是私有地址。

五、手写TCP/IP用户态协议栈(纯C语言)

640.png


手写3000行代码,让你掌握网络通信核心技术。

最后:

给校招的小伙伴一句话:第一份工作不亚于一次高考,珍惜校招,社招的竞争是你目前想象不到的。能去大厂觉不妥协,IT行业第一份工作背景越好,起点越高,后续发展空间越好!

给那些1-3年的安于现状的伙伴一句话:

不要抱怨市场,不要安于现状,在低端,往中端领域看,在中端往高端领域看。认知以及对自身的要求,都会有所改变。

给那些担心35岁的伙伴一句话:

决定上限的不是年纪,而是技术。最后:希望学习路线对你有所帮助,希望码农的我们越来越好!


640.jpg

相关文章
|
22天前
|
移动开发 网络协议 安全
网络面试题:什么是 TCP/IP?
网络面试题:什么是 TCP/IP?
41 0
网络面试题:什么是 TCP/IP?
|
28天前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
2月前
|
JSON 缓存 运维
Dataphin数据服务API开启IP白名单调用鉴权
Dataphin数据服务API提供便捷的API开发及运维、应用调用权限管理等功能,为数据业务化提供了坚实的支撑。在应用调用API的时候,Dataphin可支持通过AcessKey方式的调用鉴权。而在企业内部网络中,也可以使用IP白名单方式简化调用。本文将为您介绍如何开启IP白名单的调用鉴权。
|
3月前
|
消息中间件 网络协议 Unix
Posix API 与 网络协议栈 详细介绍
Posix API 与 网络协议栈 详细介绍
57 0
|
1月前
|
JSON 网络协议 算法
网络原理-TCP/IP(1)
网络原理-TCP/IP(1)
|
2月前
|
存储 网络协议 安全
POSIX API与网络协议栈
POSIX API与网络协议栈
34 0
|
2月前
|
网络协议 安全 网络安全
探秘网络通信:UDP与TCP/IP的奥秘
探秘网络通信:UDP与TCP/IP的奥秘
68 0
|
3月前
|
网络协议 网络性能优化 网络架构
计算机网络知识和TCPIP常见问题
计算机网络知识和TCPIP常见问题
36 0
|
3月前
|
缓存 JSON API
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
35 3
|
3月前
|
网络协议 网络架构
【网络奇缘】- 计算机网络|分层结构|深入探索TCP/IP模型|5层参考模型
【网络奇缘】- 计算机网络|分层结构|深入探索TCP/IP模型|5层参考模型
23 0