TCP/IP 基础

242 阅读7分钟

什么是TCP?

计算机网络链接在一起,使得计算机能够发挥出其本身最大的潜力。但是如果只是连接在一起,但是计算机之间却无法交流信息,因为他们没有共通的语言,所以TCP/IP就诞生了。

  • TCP/IP不是一个协议,而是一个协议族的统称。

里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。

这就好比我们现在都在使用的普通话,在没有普通话之前,大家可能来自不同的地方,使用各地的方言来进行交流,这样的话就没有办法进行沟通,谁也不知道对方说的话是什么意思,而普通话,正好解决了这个问题。

TCP/IP协议族

今天咱们主要来了解数据链路层、网络层、传输层这三层OSI模型,而TCP/IP协议族主要集中在这三层。

  • TCP协议是IP协议的上层协议,是应用层协议的下层协议
  • OSI模型有七层,TCP在第4层传输层,IP在第3层网络层,而ARP在第2层数据链路层。
  • 高层对低层是有强依赖的,所以TCP的建立前要进行ARP的请求和应答。

IP协议

  • IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。

要注意的是,IP协议并不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP或UDP要做的事情。

所以这也就出现了TCP是一个可靠的协议,而UDP就没有那么可靠的区别。

咱们仔细看看这张图,这里面有一个8位生存时间,这个字段规定该数据包在穿过多少个路由之后才会被抛弃,其最大值为255,也就是说这个ip协议包在每穿过一个路由器,这个TTL生存字段就会减1,超过255个路由器之后,该ip协议包丢失,这也证明了IP协议并并不是可靠的协议。

IP地址:

  • 网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)。

现在,通常使用的IP地址是一个32bit的数字,也就是我们常说的IPv4标准,这32bit的数字分成四组,也就是常见的255.255.255.255的样式。

如何判断两个IP地址网络号是否相同?

  • 关键信息:IP地址和子网掩码

现在我们来看看我们电脑里面对IP地址的配置:

  • 首先将10进制的IP地址和子网掩码全部转化成二进制数据.

    子网掩码是由32bit的二进制数字序列,形式为是一连串的1和一连串的0。

    例如:255.255.255.0(二进制就是11111111.11111111.11111111.00000000)

  • 将子网掩码和IP地址进行"与"操作,这样的话就能得到一个新的值.

  • "与"操作的运算规则:

      0&0=0;   0&1=0;    1&0=0;     1&1=1;
      即:两位同时为"1",结果才为"1",否则为"0"
    
  • 将新值二进制转化成10进制,即可得到网络号

IP路由选择

当一个IP数据包准备好了的时候,IP数据包是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来"送货"的呢?

也就是说我要给你写信,就必须要知道你的地址,不然邮局的快递小哥怎么给你送过去呢?

最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这就要靠ARP协议了,后面会讲到。

稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。

那么路由器就要通过ip包的信息来为ip包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个IP数据包。

如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。

* 1.搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机   
* 2.搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码”的协助。如果找到路由器,则将该包发向路由器。
* 3.搜索路由表,如果匹配同子网路由器失败,则匹配同网号路由器,如果找到路由器,则将该包发向路由器。
* 4.搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包.
如果都失败了,就丢掉这个包。

这再一次证明了,ip包是不可靠的。因为它不保证送达。

ARP作用:

ARP叫做地址解析协议,是用IP地址换MAC地址的一种协议。

  • IP 地址,是一个32bit的数值,仅仅知道主机的ip地址是无法让内核将数据帧发送给主机

  • 网络接口硬件地址,48bit的值,用来表示以太网网络接口。在硬件层次上,进行数据交换必须有正确的接口地址,内核必须知道目的端的硬件地址才能发送数据。

简言之,就是在以太网中,一台主机要把数据帧发送到同一局域网上的另一台主机时,设备驱动程序必须知道以太网地址才能发送数据。而我们只知道IP地址,这时就需要采用ARP协议将IP地址映射为以太网地址。

ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

注意:一般认为ARP协议只使适用于局域网。

一个典型的arp缓存信息如下:

tcp三次握手

现在我们来用一张gif图来说明再进行http发送请求数据之前建立的连接:

  • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=X,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=X+1,随机产生一个值seq=Y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

  • 第三次握手:Client收到确认后,检查ack是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=Y+1,并将该数据包发送给Server,Server检查ack是否为Y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

好了,关于TCP/IP部分内容就先整理到这里了