网络编程-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

原文地址:https://www.cnblogs.com/guyanzhi/p/10156948.html

时间: 2024-10-13 03:06:57

网络编程-TCP传输数据--封包拆包的相关文章

Socket网络编程(TCP/IP/端口/类)和实例

Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而

JAVA网络编程-----tcp

java采用TCP传输时利用Socket和ServerSocket Socket和ServerSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输. 关闭Socket 同样,客户端与服务端是两个独立的应用程序. 演示tcp传输 1.   tcp分客户端和服务端 2.   客户端对应的对象是Socket,服务端对应的对象是ServerSocket. 客户端: 通过查阅socket对象,发现在该对象建立时,就可以连接指定主机, 因为tcp是面向连接的,所以在建立so

GO语言练习:网络编程 TCP 示例

1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 1 package main 2 3 import ( 4 "net" 5 "os" 6 "io" 7 "bytes" 8 "fmt" 9 ) 10 11 func main() { 12 if len(os.Args) != 2 { 13 fmt.Fprintf(os.Stderr, "Usage : %s

python网络编程——TCP

<pre name="code" class="python"> 一.网络通信模式 对于网络通信,现在遵循的是TCP/IP协议组. 而现在设计的通信模式中,主要使用的是客户端/服务器编程,所谓的客户端就是我们用户所用的软件,而服务端则是程序开发人员根据客户端的需要设计的服务模式,为了是满足客户端的要求,实现和客户端进行正常通信. 二.套接字:通信的端点 对于tcp/Ip协议来说,它是一个多层协议族,分别是物理层,数据链路层,网络层,传输层,应用层.对于网

网络编程TCP总结及实践-C语言

网络变成首先要注意IP和端口的转换,现在电脑基本上是主机字节序,存储按照小端方式,而在网络中传输统一使用大端方式,所以网络变成首先要注意字节序的转换. 一个常用的ip转换程序的实现: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define CHIP(ip) (ip&0xff)<<24 |(ip&(0xff<&

Linux网络编程-----TCP程序设计

基于TCP-服务器 1.创建一个socket, 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.设置允许的最大连接数,用函数listen(). 4.等待来自客户端的连接请求,用accept() 5.收发数据,用函数send()和recv(),或者read()和write() 6.关闭网络连接 基于TCP-客户端 1.socket创建套接字 2.设置要连接服务器的IP地址和端口等属性 3.连接服务器,用函数connect() 4.收发数据,用函数send()和recv(),或

网络编程TCP/IP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

黑马程序员——JAVA基础-网络编程-TCP

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- TCP传输 两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流.该流中既有读取,也有写入. tcp的两个端点:一个是客户端,一个是服务端. 客户端:对应的对象,Socket 服务端:对应的对象,ServerSocket TCP客户端: ①:建立tcp的socket服务,最好明确具体的地址和端口.这个对象在创建时,就已经可以对指定ip和端口

网络编程TCP/IP与UDP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议