深入理解网络通信协议一之TCPIP四层模型

快速理解网络通信协议

5.1五层模型

网络编程懒人入门(一):快速理解网络通信协议(上篇)_1.jpg

  1. 物理层:把主机连接起来的物理手段,作用是负责传送01电信号

  2. 链路层:确定物理层上01信号的分组方式;一组电信号称为帧,一个帧分成两部分:标头(head)与数据(data),标头长度固定为18字节,数据长度最短为46字节,最长为1518字节。如果数据很长必须进行分割。

    Mac地址:表头中所包含的发送者信息与接收者信息。发送者与接收者就是通过mac地址标识的。每块网卡出场时,都有一个全世界独一无二的mac地址,长度是48个二进制位,通常由12个十六进制数表示。

    1)通过ARP协议找到另一块网卡的mac地址

    2)通过广播的方式给所有同一子网的计算机发送数据,由目标计算机自己判断是否接收

  3. 网络层:如果仅靠mac地址,在不同子网的前提下是不能发送给目标计算机的,而且以广播的方式发送数据包效率低。

网络编程懒人入门(一):快速理解网络通信协议(上篇)_7.jpg

路由就是如何向不同的子网络发送数据包,在相同子网络的前提下使用mac广播发送数据。由此网络层就诞生了。

网络层的作用就是使用网络地址(网址)来区分不同计算机是否属于同一个子网络。

网络地址与mac地址没有任何关系,从逻辑上来看就是网络地址帮我们找到目标主机所在的子网络,在该子网络通过mac地址找到目标主机

**IP协议有两个作用:**一个是为每个计算机分配IP地址,另一个是确定哪些地址在同一个子网络

IP数据包的“标头”部分长度为20到60字节,整个数据包的总长度最大为65535字节。以太网中最长只有1500字节,因此如果ip数据包超过1500字节,他就需要分割成几个以太网数据包,分开发送。

**ARP协议:**可以得到同一子网内主机的mac地址,可以把数据包发送到任意一台主机上。

第一种情况:如果两台主机不在同一个子网络,没有办法直接获得对方的MAC地址,所以只能把数据包传送到两个子网络连接处的“网关”,让网关去处理;

第二种情况:如果两台主机在同一个子网络下,使用ARP协议找到对方的MAC地址。具体方法:APR协议发送一个数据包,该数据包中包含目的主机IP地址,在对方的mac地址用"FF:FF:FF:FF:FF:FF“广播地址。它所在子网络的的每一台主机都会收到数据包,从中取出IP地址,与自身IP地址对比,相同,就告知对方自己的mac地址。

  1. 传输层:我们需要参数,表示这个数据包到底那个进程使用的,用端口来标识,每个数据包都发到特定的端口,所以不同程序就能取到自己所需的数据。

    端口的大小065535,01023的端口被系统占用。传输层的功能,就是建立“端口到端口”的通信,网络层的功能就是建立“主机到主机”的通信。主要确定主机和端口就实现了程序之间的交流。

**UDP协议:**标头部分主要定义发出端口和接收端口,“数据”部分就是具体的内容;UDP标头部分一共只有8个字节,总长度不超过65535字节。

**TCP协议:**UDP比较简单容易实现,但是可靠性较差,一旦数据包发出,无法知道对方是否接收到。为了解决这个问题,提高网络可靠性,TCP协议应运而生。可以近似认为是加了确认机制的UDP协议,如果有一个数据包遗失,收不到确认就会重发该数据包。但是缺点就是i过程复杂,实现困难,消耗较多资源。

  1. 应用层:规定应用程序的数据格式。

此时以太网的数据包就变成下面这样

网络编程懒人入门(一):快速理解网络通信协议(上篇)_13.jpg

发送这个包需要知道两个地址:

  • 对方的mac地址
  • 对方的ip地址

有了这两个地址,数据包才能准确送到接收者手里。但是,前面说过,mac地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的mac地址,必须通过网关转发。

网络编程懒人入门(二):快速理解网络通信协议(下篇)_2.jpg

**具体步骤:**1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,如果不是,于是就把这个数据包发送给网关A。网关A通过路由协议,发现4号电脑位于子网络B,把数据包发送给网关B,网关B再转发到4号电脑。

1号电脑把数据包发到网关A,必须知道网关A的MAC地址。所以,数据包的目标地址,实际上分成了两种情况:

场景数据包地址
同一个子网络对方的MAC地址,对方的IP地址
非同一个子网络网关的MAC地址,对方的IP地址

动态IP地址

计算机开机后,会自动分配一个IP地址,它使用的协议是DHCP协议。该协议规定有一个DHCP服务器负责管理本网络的所有IP地址,当有新计算机加入网络,必须向DHCP服务器发送一个DHCP请求数据包,申请IP地址和相关的网络参数。

一个实例:访问网页

  1. 本机参数

    本机的IP地址:192.168.1.100;

    子网掩码:255.255.255.0;

    网关的IP地址:192.168.1.1;

    DNS的IP地址:8.8.8.8。

    浏览器要向Google发送一个网页请求的数据包

  2. DNS参数

    发送数据包必须知道对方的ip地址,但是我们只知道网址www.google.com,DNS协议可以帮助我们,将网址转换成ip地址,已知DNS服务器8.8.8.8,于是我们向这个网址一个DNS数据包(53端口)

    网络编程懒人入门(二):快速理解网络通信协议(下篇)_7.jpg

    然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105。我们知道了对方的IP地址。

  3. 子网掩码

    之后,我们判断这个IP地址是否在同一个子网络下,我们用到子网掩码;具体步骤是首先判断是否再同一子网络中,用子网掩码AND运算,之后对比。因此,我们要想Google发送数据包,必须通过网关192.168.1.1转发,接受方的MAC地址将是网关的mac地址。

  4. 应用层协议

    浏览网页用的是HTTP协议,它整个数据包构造是这样

    网络编程懒人入门(二):快速理解网络通信协议(下篇)_8.jpg

    GET / HTTP/1.1
    Host: [url=http://www.google.com]www.google.com[/url]
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 6.1) ......
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
    Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
    Cookie: ... ...
    
  5. TCP协议

    TCP数据包需要端口,接收方(Google)的HTTP端口默认是80,发送方(本机)是一个1024~65535之间的整数,假定为51775,TCP数据包的头部长度为20字节。

  6. IP协议

    IP数据包需要设置双方的IP地址,这是已知的,发送方IP192.168.1.100(本机);接收方IP172.194.72.105(Google)IP数据包的头部长度为20字节

  7. 以太网协议

    以太网数据包需要设置双方的mac地址,发送方为本机的网卡mac地址,接收方为网关192.168.1.1的mac地址(通过arp协议获得到的);以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度是5000字节,所以ip数据包要分成四个包。每个包都有自己的ip标头(20字节),所以四个包的ip数据包的长度分别为1500、1500、1500、560;

  8. 服务器端响应

    经过多个网关转发,Google服务器172.168.72.105,收到四个以太包。根据IP标头的序号,Google将四个包拼起来,取出完成的TCP数据包,然后读出里面的HTTP请求,接着做HTTP响应,再用TCP发过来。本机收到HTTP响应后,就可以将网页显示出来,完成一次网络通信。

ogle服务器172.168.72.105,收到四个以太包。根据IP标头的序号,Google将四个包拼起来,取出完成的TCP数据包,然后读出里面的HTTP请求,接着做HTTP响应,再用TCP发过来。本机收到HTTP响应后,就可以将网页显示出来,完成一次网络通信。

网络编程懒人入门(二):快速理解网络通信协议(下篇)_10.jpg

5.2TCP协议的作用

TCP是以太网协议和IP协议的上层协议,也是应用层协议的下层协议

最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决子网内部的点对点通信。

IP协议可以解决多个局域网之间的通信。IP协议定义了一套自己的地址规则,称为IP地址,实现路由的功能,允许某个局域网的A主机向局域网B主机发送信息。

路由器就是基于IP协议,局域网之间就要靠路由器连接。路由器的原理也很简单,路由器内部有一张路由表,规定A段IP走出口一,B段IP走出口二,…,通过这套指路牌,实现数据包的转发。

TCP数据包的大小

以太网数据包(packet)的大小是固定的,1522个字节,其中1500字节是负载,22字节是头部信息。IP数据包再以太网数据包的复杂中,它自己的头部至少需要20字节,所以IP数据包的负载最多为1480字节。

网络编程懒人入门(三):快速理解TCP协议一篇就够_6.jpg

TCP数据包在IP数据包的负载里面。他的头部信息最少也要20字节,因此TCP数据包最大负载是i460字节。所以TCP负载实际为1400字节。一条1500字节信息需要两个TCP数据包。HTTP2.0最大的改进就是压缩HTTP协议的头部信息,使得一个HTTP请求可以放在一个TCP数据包里面,而不是分成多个,这样就提高了速度。

慢启动与ACK

服务器发送数据包,当然越快越好,最好一次都发送过去,但是发送的越快可能丢包就越多。最理想的状态就是,在线路允许的情况下,以最高的速率传输数据。解决的办法就是慢慢试。

在TCP中为了做到效力于可靠性的统一,设计了慢启动机制,开始的时候比较慢,根据丢包的情况调整速率,如果不丢包就加快发送速率;如果丢包就降低发送速率。

在linux中的底层实现:内核中用常量TCP_INIT_CWND这个变量控制,开始通信时,发送方一次发送10数据包,发送窗口大小为10,然后停下来,等待接收方确认在继续发送。默认情况下,接收方每收到两个TCP包就要发送确认信息。这个确认信息简称ACK。

ACK中包含两个信息:

  • 期待要接收下一个数据包的编号
  • 接收方的接收窗口的剩余容量

发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为"发送窗口",这个窗口的大小是可变的。

网络编程懒人入门(三):快速理解TCP协议一篇就够_10-14.36.jpg

对于带宽很大,线路很好的连接,TCP也总是从10个数据包开始慢慢试,过一段时间后,才达到最高的传输速率,这就是TCP的慢启动。

数据包的遗失问题:

TCP协议怎么保证数据通信的完整性的。

每个数据包都携带下一个数据的编号,如果下一个数据包没有收到,那么ACK的编号就不会发生变化

比如现在收到4号包,但是没有收到5号包,ACK就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一次ACK更新编号。如果5号包还没有收到但是收到了6号包7号包,那么ACK里面的编号不会发生变化,即总是显示5号包。如果发送方发现三个连续重复的ACK,或者超时还没有收到ACK,就会确认丢包,即5号包遗失,从而再次发送这个包。通过这种机制保证了数据的可靠性。

网络编程懒人入门(三):快速理解TCP协议一篇就够_12.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值