博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/IP
阅读量:5243 次
发布时间:2019-06-14

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

四层协议概述

TCP/IP通常被认为是一个四层协议系统:应用层、传输层、网络层、数据链路层,每层都有相应的协议。TCP/IP协议族是一组不同的协议组合在一起构成的协议族。尽管通常称该协议族为TCP/IP,但TCP和IP只是其中的两种协议而已,每一层负责不同的功能:

分层的概念说起来非常简单,但在实际的应用中非常的重要,在进行网络设置和排除故障时对网络层次理解得很透将对工作有很大的帮助。

例如:设置路由是网络层IP协议的事,要查找MAC地址是链路层ARP的事,常用的Ping命令由ICMP协议来做的。

各层协议的关系,理解它们之间的关系对下面的协议分析非常重要,用户进程可以直接发icmp和ip网络层包(ping发的是icmp),如下图。

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息 (有时还要增加尾部信息),TCP传给IP的数据单元称作TCP报文段或简称为TCP段。IP传给网络接口层的数据单元称作IP数据报。 通过以太网传输的比特流称作帧(Frame)。 数据发送时是自上而下,层层加码;数据接收时是自下而上,层层解码。

逻辑上通讯是在同级完成的,垂直方向的结构层次是当今普遍认可的数据处理的功能流程。每一层都有与其相邻层的接口。为了通信,两个系统必须在各层之间传递数据、指令、地址等信息, 通信的逻辑流程与真正的数据流的不同。虽然通信流程垂直通过各层次,但每一层都在逻辑上能够直接与远程计算机系统的相应层直接通信。从下图可以看出,通讯实际上是按垂直方向进行的,但在逻辑上通信是在同级进行的。 

以太网协议

以太网的头信息(括号内的数均为该字段所占字节数),以太网报头中的前两个字段是以太网的源地址(6)和目的地址(6)。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。以太网帧类型(2)表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0806。 

发出去时时行1,接受时是行2

 

ARP协议

在局域网内,ARP负责的是在众多联网的计算机中找到需要找的计算机,找到工作就完成了。 

当广播发到ip等于目的端ip的机器时,该机器就会在获取ARP请求报文后把机器硬件地址填到目的端硬件地址,然后互换发送端地址和目的端地址,并把操作字段置为2,最后把它发送回去。 (发出去时时行1,接受时是行2)

ARP报头

ARP协议的头信息(括号内的数均为该字段所占字节数)。硬件类型(2)字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型(2)字段表示要映射的协议地址类型,它的值为0800即表示IP地址,它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。硬件地址长度(1)和协议地址长度(1)分别指出硬件地址和协议地址的长度,以字节为单位,对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。Op(2)即操作(Opoperation),1是ARP请求、2是ARP应答、3是 RARP请求和4为RARP应答。发送端的硬件地址(6)、发送端的IP地址(4)、目的端的硬件地址(6)和目的端IP地址(4)。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。 

IP协议

IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输的,有个形象的比喻IP协议就像运货的卡车,将一车车的货物运向目的地。主要的货物就是TCP或UDP分配给它的。需要特别指出的是IP提供不可靠、无连接的数据报传送,也就是说IP仅提供最好的传输服务但不保证IP数据报能成功地到达目的地。看到这你会不会担心你的E_MAIL会不会送到朋友那,其实不用担心,上文提过保证数据正确到达目的地是TCP的工作。 

IP报头

下图中45 00—71 01为IP的头信息。这些数是十六进制表示的。一个字节占8位,一个数(int)占4位,例如:4的二进制是0100   

4位版本:表示目前的协议版本号,数值是4表示版本为4,因此IP有时也称作IPv4;   

4位首部长度(单位4字节):头部的是长度,数值为5表示IP头部长度为20字节。 

8位服务类型(TOS):00,这个8位字段由3位的优先权子字段,现在已经被忽略,4位的TOS子字段以及1位的未用字段(现在为0)构成。4位的TOS子字段包含:最小延时、最大吞吐量、最高可靠性以及最小费用构成,这四个1位最多只能有一个为1,本例中都为 0,表示是一般服务。

16位总长度(字节数):总长度字段是指整个IP数据报的长度,以字节为单位。数值为00 30,换算为十进制为48字节,48字节=20字节的IP头+28字节的TCP头,这个数据报只是传送的控制信息,还没有传送真正的数据,所以目前看到的总长度就是报头的长度。
16位标识:标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1,分片时涉及到标志字段和片偏移字段。
8位生存时间(TTL):TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。ttl的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去1。可根据TTL值判断服务器是什么系统和经过的路由器。 
8位协议:表示协议类型,6表示传输层是TCP协议。
16位首部检验和:当收到一份IP数据报后,同样对首部中每个16位进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1,即检验和错误,那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
32位源IP地址和32位目的IP地址:实际这是IP协议中核心的部分,32位的IP地址由一个网络ID和一个主机ID组成。 

TCP协议详解

TCP报头

TCP的头信息是:04 28 00 15 3A DF 05 53 00 00 00 00 70 02 40 00 9A 8D 00 00 02 04 05 B4 01 01 04 02

端口号:这里指的端口就是TCP或UDP的端口,源端口和目的端口各占16位,2的16次方等于65536,一台电脑最多可以开65536个端口。一般作为服务一方每项服务的端口号是固定的,需要指出的是这是服务的控制端口(socket accept的监听端口),数据传送时用另一端口,客户端与服务器联系时随机开一个大于1024的端口进行数据传输。你的电脑中了木马也会开一个服务端口。观察端口非常重要,不但能看出本机提供的正常服务,还能看出不正常的连接。 Windows查看端口的命令时netstat。

32位序号:也称为顺序号(Sequence Number),简写为SEQ,当一方要与另一方联系时就发送一个初始序号给对方,意思是:“让我们建立联系吧?”,服务方收到后要发个独立的序号给发送方,意思是“消息收到,数据流将以这个数开始。”由此可看出,TCP连接完全是双向的,即双方的数据流可同时传输。在传输过程中双方数据是独立的,因此每个TCP连接必须有两个顺序号分别对应不同方向的数据流。
32位确认序号:也称为应答号 (Acknowledgment Number),简写为ACK。在握手阶段,确认序号将发送方的序号加1作为回答,在数据传输阶段,确认序号将发送方的序号加发送的数据大小作为回答,表示确实收到这些数据。
4位首部长度(单位4字节):这个字段占4位。本例值为7,TCP的头长度为28字节,等于正常的长度20字节加上可选项8个字节。TCP的头长度最长可为60字节(二进制1111换算为十进制为15,15*4字节=60字节)。
6个标志位:

  1.   URG 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据
  2.   ACK 置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。
  3.   PSH 置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。
  4.   RST 置1时重建连接。如果接收到RST位时候,通常发生了某些错误。
  5.   SYN 置1时用来发起一个连接。
  6.   FIN 置1时表示发端完成发送任务。用来释放连接,表明发送方已经没有数据发送了.

16位窗口大小:TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。

16位检验和:检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
16位紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
选项:有8个字节选项。最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在握手的第一步中指明这个选项。它指明本端所能接收的最大长度的报文段。

TCP连接三次握手

这三行数据是两机建立连接的过程,核心意思就是TCP协议的三次握手。TCP的数据包是靠IP协议来传输的。但IP协议是只管把数据送到出去,但不能保证IP数据报能成功地到达目的地,保证数据的可靠传输是靠TCP协议来完成的。当接收端收到来自发送端的信息时,接受端详发送短发送一条应答信息。TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。建立连接的过程就是三次握手的过程。

下面来分析一下此例的三次握手过程。

  1. 请求端208号机发送一个初始序号(SEQ)987694419给1号机。
  2. 服务器1号机收到这个序号后,将此序号加1值为987694419作为应答信号(ACK),同时随机产生一个初始序号(SEQ)1773195208,这两个信号同时发回到请求端208号机,意思为:“消息已收到,让我们的数据流以1773195208这个数开始。”
  3. 请求端208号机收到后将确认序号设置为服务器的初始序号(SEQ)1773195208加1为1773195209作为应答信号。

TCP头信息就可以看出,在握手过程中TCP头部的相关字段也发生了变化:

如图13-1请求端208号机发送一个初始序号(SEQ)987694419给1号机。标志位SYN置为1。

如图13-2服务器1号机收到这个序号后,将应答信号(ACK)和随机产生一个初始序号(SEQ)1773195208发回到请求端208号机,因为有应答信号和初始序号,所以标志位ACK和SYN都置为1。
如图13-3请求端208号机收到1号机的信号后,发回信息给1号机。标志位ACK置为1,其它标志为都为0。注意此时SYN值为0,SYN是标示发起连接的,上两步连接已经完成。

TCP数据传输

连接阶段用的是服务控制端口21,传输阶段随机生成一个大于1024的端口使用。

这四行数据是数据传输过程中一个发送一个接收的过程。

TCP提供一种面向连接的、可靠的字节流服务。当接收端收到来自发送端的信息时,接受端要发送一条应答信息,表示收到此信息。

数据传送时被 TCP分割成认为最适合发送的数据块。一般以太网在传送时TCP将数据分为1460字节。也就是说数据在发送方被分成一块一块的发送,接受端收到这些数据 后再将它们组合在一起。

57行显示1号机给208号机发送了大小为1514字节大小的数据,我们前文讲过数据发送时是层层加协议头的,1514字节=14字节以太网头 + 20字节IP头 + 20字节TCP头 + 1460字节数据
58行显示的应答信号ACK为:1781514222,这个数是57行得SEQ序号1781512762加上传送的数据1460,208号机将这个应答信号发给1号机说明已收到发来的数据。
59、60行显示的是继续传送数据的过程。

TCP关闭四次握手

 建立一个连接需要三次握手,而终止一个连接要经过4次握手。这是因为一个TCP连接是全双工(即数据在两个方向上能同时传递,每个方向必须单独地进行关闭。4次握手实际上就是双方单独关闭的过程。(再次和端口21交互) 

本例文件下载完后,关闭浏览器终止了与服务器的连接,图显示的就是终止连接所经过4次握手过程:

  1. 93行数据显示的是关闭浏览器后,208号机将FIN置1连同序号(SEQ)987695574发给1号机请求终止连接。
  2. 94行数据显示1号机收到FIN关闭请求后,发回一个确认,并将应答信号设置为收到序号加1,这样就终止了这个方向的传输。(关闭后就不会在收消息但还可以发,即下一步95行数据为什么存在的原因。)
  3. 95行数据显示1号机将FIN置1连同序号(SEQ)1773196056发给208号机请求终止连接。
  4. 96行数据显示208号机收到FIN关闭请求后,发回一个确认,并将应答信号设置为收到序号加1,至此TCP连接彻底关闭。(此时1号机端其实已收不到)

 

 

转载于:https://www.cnblogs.com/wade-luffy/p/5916597.html

你可能感兴趣的文章
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
stap-prep 需要安装那些内核符号
查看>>
2016寒假自学笔记
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>
磁盘测试工具
查看>>
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>