博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/IP协议-------概述
阅读量:4180 次
发布时间:2019-05-26

本文共 3429 字,大约阅读时间需要 11 分钟。

TCP/IP协议

TCP/IP是一系列协议的集合,称之为协议族(Protocol Family),这个协议族包含了IP协议,TCP协议,UDP协议,HTTP协议,STMP协议POP协议等等。可能是因为TCP和IP是该协议族中最重要的两个协议,因此将其命名为TCP/IP。

网络分层

网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合。 T C P / I P通常被认为是一个四层协议系统,OSI为七层模型。两种模型对应关系如下图所示:

这里写图片描述

每一层负责不同的功能:

1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在T C P / I P协议族中,网络层协议包括 I P协议(网际协议),I C M P协议(I n t e r n e t互联网控制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。

3 ) 运输层主要为两台主机上的应用程序提供端到端的通信。在 T C P / I P协议族中,有两个互不相同的传输协议:T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途。

4 ) 应用层负责处理特定的应用程序细节。几乎各种不同的 T C P / I P实现都会提供下面这些通用的应用程序:

• Telnet 远程登录。• FTP 文件传输协议。• SMTP 简单邮件传送协议。• SNMP 简单网络管理协议。

TCP/IP的分层

在T C P / I P协议族中,有很多种协议。TCP/IP协议族中不同层次的协议如下图:

这里写图片描述

互联网的地址

互联网上的每个接口必须有一个唯一的 I n t e r n e t地址(也称作 I P地址)。I P地址长32 bit。I n t e r n e t地址并不采用平面形式的地址空间,如 1、2、3等。I P地址具有一定的结构,五类不同的互联网地址格式如下图所示。

这里写图片描述

这些3 2位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方法称作“点分十进制表示法(Dotted decimal notation)”。下图为各类IP地址的范围:

这里写图片描述

多接口主机具有多个 I P地址,其中每个接口都对应一个 I P地址。

有三类I P地址:单播地址(目的为单个主机)、广播地址(目的端为给定网络上的所有主机)以及多播地址(目的端为同一组内的所有主机)。

有了 IP 地址,用户的计算机就可以发现并连接互联网中的另外一台计算机。

linux系统中通过ifconfig查询本机的IP地址。

域名系统

尽管通过I P地址可以识别主机上的网络接口,进而访问主机,但是人们最喜欢使用的还是主机名。在 T C P / I P领域中,域名系统( D N S)是一个分布的数据库,由它来提供 I P地址和主机名之间的映射信息。

常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux 组织(www.lwn.net)等等。

我们可以使用命令”nslookup”或者“ping”来查看与域名相对应的 IP 地址,我们可以使用nslookup baidu.com查看百度服务器的IP地址。

数据封装

当应用程序用 T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。

这里写图片描述

T C P传给I P的数据单元称作 T C P报文段或简称为 T C P段(T C Ps e g m e n t)。I P传给网络接口层的数据单元称作 I P数据报(IP datagram)。通过以太网传输的比特流称作帧(Fr a m e )。

帧头和帧尾下面所标注的数字是典型以太网帧首部的字节长度。以太网数据帧的物理特性是其长度必须在 4 6~1 5 0 0字节之间。U D P数据与T C P数据基本一致。唯一的不同是 U D P传给I P的信息单元称作 U D P数据报(UDP datagram),而且U D P的首部长为8字节。

数据分用

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用( D e m u l t i p l e x i n g)。

这里写图片描述

为协议I C M P和I G M P定位一直是一件很棘手的事情。把它们与I P放在同一层上,那是因为事实上它们是I P的附属协议。但是在这里,我们又把它们放在I P层的上面,这是因为ICMP和IGMP报文都被封装在IP数据报中。对于A R P和R A R P,我们也遇到类似的难题。在这里把它们放在以太网设备驱动程序的上方,这是因为它们和I P数据报一样,都有各自的以太网数据帧类型。我们又把A R P作为以太网设备驱动程序的一部分,放在 I P层的下面,其原因在逻辑上是合理的。这些分层协议盒并不都是完美的。

端口号

T C P和U D P采用16 bit的端口号来识别应用程序。那么这些端口号是如何选择的呢?服务器一般都是通过知名端口号来识别的。例如,对于每个 T C P / I P实现来说,F T P服务器的T C P端口号都是2 1,每个Te l n e t服务器的T C P端口号都是2 3,每个T F T P (简单文件传送协议)服务器的U D P端口号都是6 9。任何T C P / I P实现所提供的服务都用知名的 1~1 0 2 3之间的端口号。这些知名端口号由 I n t e r n e t号分配机构(Internet Assigned Numbers Authority, IANA)来管理。

分组交换

分组交换是指将较大的数据分割为若干个较小的数据,然后依次发送。使用分组交换的原因是不同的数据链路有各自的最大传输单元(MTU: Maximum Transmission Unit)。不同的数据链路就好比不同的运输渠道,一辆卡车(对应通信介质)的载重量为 5 吨。那么通过卡车运送 20 吨的货物就需要把这些货物分成四部分,每份重 5 吨。如果运输机的载重量是 30 吨,那么这些货物不需要分割,直接一架运输机就可以拉走。

以以太网(一种数据链路)为例,它的MTU是 1500 字节,也就是通过以太网传输的数据,必须分割为若干帧,每个帧的数据长度不超过 1500 字节。如果上层传来的数据超过这个长度,数据链路层需要分割后再发送。

RFC

RFC(Request for Comment)文档是所有以太网协议的正式标准,并在其官网上面公布,由 IETF 标准协会制定。大量的 RFC 并不是正式的标准,出版的目的只是为了提供信息。RFC 的篇幅不一,从几页到几百页不等。每一种协议都用一个数字来标识,如 RFC 3720 是 iSCSI 协议的标准,数字越大说是 RFC 的内容越新或者是对应的协议(标准)出现的比较晚。

所有的 RFC 文档都可以从网络上找到,其官网为IETF。在网站上面可以通过分类以及搜索快速找到目标协议的 RFC 文档。目前在 IETF 网站上面的 RFC 文档有数千个,但是我们不需要全部掌握,在工作或学习中如果遇到可以找到对应的解释,理论与实际结合会有更好地效果,单纯阅读 RFC 的效果一般。

你可能感兴趣的文章
byte数组和InputStream的相互转换
查看>>
InputStream,InputStreamReader和Reader之间的区别与关系
查看>>
Java中System.arraycopy方法的使用
查看>>
tk.mybatis的使用记录
查看>>
遍历获取目录下的所有文件
查看>>
从指定服务器路径下载文件
查看>>
EasyExcel读取和写入java model数据
查看>>
《C编译原理》共享库的动态加载和静态加载
查看>>
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>
指向指针的指针
查看>>
《tiny6410裸机程序》第三章:基础汇编test1
查看>>