C++ 服务器 三

  今天继续给大家分享C++服务器中的ip协议。

  IP协议有两个很大的特点:第一个是不可靠的,意思就是说,它并不能保证数据包成功的到达目的地。也就是说a计算机发送了一个数据包发送到了b计算机,但是ip协议本身并不能保证数据包一定能够到达,ip所能提供的是最好的传输服务,如果在传输过程中发生了某种错误,例如传输过程中有一个路由器内存用完了,这种会出现什么情况在ip层面会有一个很简单暴力的解决方法,他会将整个数据的数据包完全丢掉。第二个特点就是无连接,无连接的意思就是说在传输过程中,每个数据的数据包都是相互独立的,数据包之间并没有联系也并没有说按照一定的顺序,还有可能不同的数据包传输路径都是不一样的,可能我先发送的a数据包后发送的b数据包,但是我在接受的时候很有可能先接受b数据包再收到a数据包,这种是用来形容整个网络的,但是当同一个计算机都通过ip协议来打包之后,他发送数据包的顺序是不会改变的。但是经过路由选择的时候顺序很可能就会发生变化。

  大家还要明白一个就是网络数据都是通过big endian来进行数据传输的,这个单词的中文名字就是大端,也就是我们常说的机器的大小端。虽然我们目前用的操作系统包括windows。Linux都是用的小端,但是在网络传输过程中的数据都是应用的大端传输,大小端的选择主要是跟他的cpu相关,无论是大端也好小端也好,并没有说谁比谁好在哪里,只要是格式统一的情况下两者并没有多大区别。之前在牛客网也遇到过通过编写程序来验证大小端的程序。

思路很简单,当你定位一个数据1的时候在大端的机器中1在内存中的表示为00 00 00 01,而在小端的机器中内存中的数据是01 00 00 00那这样我们很容易就能通过位运算来判定你的机器是大端还是小端。之后我会单独整理一篇验证程序大小端的博客。

  之前给大家介绍过在发送数据的ip层的时候,会给数据添加一个ip header,那这个ip header到底是个怎么样的东西呢?

 

这是一个简单的模式图。在传送过程中先传送0-7.8-15......依次类推依次传送八个字节,如果你的操作系统是一个大端那网络传输过程中直接传输就可以,但是如果你的操作系统是小端的话就需要将其反过来传输先传输32位之后往前传输,ip header它最小是二十个字节,第一个字节中0-3是你的ip版本,目前最流行的就是ipv 4版本。后四位是你的首部长度。第二个字节是8个bit位的服务类型,在这个字节中的最后一个比特位必须是0,前三位以前是有意义的现在已经放弃不使用了,另外的四个比特位则分别代表最小时延,最大吞吐量,最高可靠性和最小费用,这个和我们的编程相关性很小。再往后的两个字节也就是16-31的比特位代表的是这次ip数据包的总长度一共是多少个字节。再往下看有个8位的TTL(Time to live)也就是数据包的存活时间,数据包在整个网络中传递的时候TTL会不断减少。当数据在link层传输的时候没传输一次TTL就会减去1,当TTL为0的时候还没有接受就会将数据丢掉并返回一个信息这个数据包没有发送到。再接下来8位是协议,这个字节是十分重要的,它规定了我们后边的数据是通过什么协议来进行传送的,是通过TCP还是其他方式,是在这个字节里边进行定义的。再往后两个字节是首部检验和,这个就是之前所说的进行计算来计算我们数据包到底在传输过程中有没有出错。再往下四个字节是32位源地址他表示你的数据到底是从哪里来的,也就是我们之前举例所说到的发送数据的host a将它的地址写在上边,就是我们写信的寄信人,后边的四个字节也很好理解了就是我们的目的地址,就是我的消息到底要发给谁。

  我们再回来说我们ip的特性,之前说了它的特性是不可靠的。那我们想这种方法是不是不太好,我们为什么不采用强链接的方式我们就通过网线将计算机连接起来,这样我们的数据的出错率是不是就能降低,这样我们的数据传输是不是更好一些。假如我们将自己的计算机和美国一个计算机通过线连接起来,这样之间会通过几十台甚至更多的计算机,这种情况下如果中间任何一台计算机出现一点点问题那这次发送的数据就算是白费了,所以相比较来说ip 的传输方式已经是一个相对完全的了,他的不可靠和无连接是他的弱点,但是也算是他成功的一个原因。

  今天对服务器的介绍先说到这里,这里的理论知识还是很多,需要更加深入的去理解网络数据传输中的过程。

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/81382963