热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络编程TCP传输数据封包拆包

网络编程如果你要开发的程序基于网络工作,要和其他计算机进行数据交互,就需要学会网络编程.请你思考,网络是什么?计算机之间相互传输数据,首先需要介质,可以是网线、光纤、无线电波,就能
网络编程

如果你要开发的程序基于网络工作,要和其他计算机进行数据交互,就需要学会网络编程.请你思考,网络是什么?

计算机之间相互传输数据,首先需要介质,可以是网线、光纤、无线电波,就能通过电(光)信号进行基本的0和1传输,可以被计算机识别.

同样的100个电信号,50个为一组和20个为一组,得到的信息是不同的,每多少位信号表示什么样的信息,比如,这组数据来自谁,要发给哪一台电脑的哪个程序?

这都需要一个标准,而网络的世界是互联互通的,所以标准也得统一,就诞生出了一套互联网协议(Internet Protocol Suite).

计算机网络的本质就是物理传输介质加上一系列的协议. 并且兼顾现实中网络的概念,即由线路和节点组成.

现在有了网络,就可以传输数据了,我们可以模拟演练 一段用户数据被传输到另一台电脑上需要这个数据的程序 的过程

而在这之前,需要梳理一下传输过程都经历了什么鬼:

为了表述更加容易理解,同时省去我们不太需要的底层通讯知识,以下对各个流程和表述做了不同程度的简化

从发送的角度来看,怎样才能将数据发送到网络?

第一,发送方的计算机的硬件(比如中继器、集线器、网线等)符不符合互联网协议的标准,如果不符合,它就不能连上网络,更不要说传数据给接收方.

第二,发送方必须明确说明,是给网络上的哪一台计算机,这个计算机的哪个服务发送数据包,这个数据包代表什么格式的数据... ...

1.封包

用户使用的都是应用程序,均工作于应用层,应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文(报文可以理解为数据).

互联网是开发的,大家都可以开发自己的应用程序,提供不同的服务,数据也就多种多样,比如Email、WWW、FTP等等,那么,必须有不同协议规定电子邮件、网页、FTP等数据的组织形式.

一段用户数据(一些二进制数字)就在这一层被加上了一个APPL (application layer)首部,就是告诉接收方,我发送的是一个什么类型的数据.

这是第一次添加,

之后,你需要指明,此数据包是给对方的哪个服务使用,最容易实现的当然就是用数字标识,这里就有一个 端口号的概念,

:端口号范围0-65535,0-1023为系统占用端口,其他的提供给各个应用服务给数据加上端口信息的过程,叫做传输层,遵从 TCP 协议 或UDP 协议,其中TCP协议更安全,但效率较低.

这是第二次添加,采用TCP协议就加上TCP首部.

接着,就需要添加一些指明对方计算机信息的数据了

在早期,计算机数量很少的黑暗年代,添加的信息遵从以太网协议(ethernet),以太网协议是这样规定的:

  • 一组电信号构成一个数据包,叫做‘帧’
  • 每一数据帧分成:报头head和数据data两部分
       head                        data                             

head包含:(固定18个字节)

  • 发送者/源地址,6个字节
  • 接收者/目标地址,6个字节
  • 数据类型,6个字节

data包含:(最短46字节,最长1500字节)

  • 数据包的具体内容

head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

mac地址

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

添加以太网协议(ethernet) 的这一层叫做数据链路层

如果两台计算机处在同一个局域网,即用交换机、路由器简单建立的连接,他们之间互相识别数据头的 MAC地址:,需要找到对方时,就将自己的数据包发送给这个局域网的交换机,交换机拿到数据,会向此局域网内其他计算机都发送这个数据包,各计算机拿到数据包之后进行拆包,发现MAC地址不是自己,就把数据丢弃,是自己就去处理数据.这种通信方式叫做广播,交换机就是一个大喇叭~~

后来啊,计算机越来越多,所有的计算机都在一个局域网显然是不现实的,数以亿计的计算机同时发送广播给同一台交换机会造成网络的灾难---广播风暴.

于是这些计算机按照线路--节点的方式,一些计算机用交换机连接在同一个子网里,每个子网有自己的识别特征,众多子网又通过硬件连接在一起,这样一层一层的线路---节点的方式,更像一个现实中的网了! 这样再找某台计算机的时候,先找到它所属的子网(广播域),再用广播的方式找到这个计算机.

那么,必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是, 就采用路由的方式(向不同广播域/子网分发数据包)于是引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址.

添加网络地址信息的这个阶段叫做网络层,网络层遵从IP协议.

IP协议:

  • 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
  • 范围0.0.0.0-255.255.255.255
  • 一个ip地址通常写成四段十进制数,例:172.16.10.1

ip地址分成两部分

  • 网络部分:标识子网
  • 主机部分:标识主机

注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网

例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网

子网掩码

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

172.16.10.1:10101100.00010000.00001010.000000001

255255.255.255.0:11111111.11111111.11111111.00000000

AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

172.16.10.2:10101100.00010000.00001010.000000010

255255.255.255.0:11111111.11111111.11111111.00000000

AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

结果都是172.16.10.0,因此它们在同一个子网络。

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

ip数据包

ip数据包也分为head和data部分,无须为ip包定义单独的栏位,直接放入以太网包的data部分

head:长度为20到60字节

data:最长为65,515字节。

而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

以太网头                ip 头                                     ip数据                                

这时候,发送方完成传输层的封包后,需要按照IP协议添加表示 IP的信息 ,再按照以太网协议添加 MAC地址的信息

发送过程中,将 ip and 子网掩码  操作后,如果接收方与发送方在同一子网,就用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),遵从ARP协议来处理数据包.

ARP协议:

在通过以太网发送IP数据包时,需要先封装网络层(32位IP地址)、数据链路层(48位MAC地址)的报头,但由于发送时只知道目标IP地址,不知道其MAC地址,所以需要使用地址解析(ARP)协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。

如:

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B     发送IP通信了。
 
这样我们终于能将数据发送到指定的计算机了!
总结一下,
数据进入协议栈时的封装(封包)过程:

 技术分享图片

 最后不要忘了,还有最底层的一层  物理层!  物理层主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0.

在细分过程中,应用层又被分成三层: 应用层,表示层,会话层,会话层结束才进入传输层.

这样就构成了 Open System Interconnection

意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

它事实上已经被TCP/IP4层模型(因特网分层模型)淘汰了,在当今世界上没有大规模使用。但TCP/IP 4层模型传输原理是OSI的简化!
我们记忆的话,可以记忆这四层 :应用层--传输层--网络层--数据链路层--物理层

参考: 《TCP/IP协议详解卷1:协议》

     http://www.cnblogs.com/linhaifeng/articles/5937962.html

网络编程-TCP传输数据--封包拆包


推荐阅读
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文详细介绍了cisco路由器IOS损坏时的恢复方法,包括进入ROMMON模式、设置IP地址、子网掩码、默认网关以及使用TFTP服务器传输IOS文件的步骤。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
qqian
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有