• 计算机网络再次整理————tcp[二]


    前言

    本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制。

    正文

    首先介绍一下什么是协议族(protocal Family),举个例子PF_INET 为ipv4 协议族了。

    为什么有一个族的概念呢?因为吧,ipv4 有很多协议,地址解析协议ARP(Address Resolution Protocol)、逆地址解析协议RARP(Reverse Address Resolution Protocol)、互联网控制报文协议ICMP(Internet Control Message Protocol)、传输控制协议TCP(Transmission Contronl Protocol)和用户数据报协议UDP(User Datagram Protocol)。

    所以要理解ip 协议还不是这么简单的,然后还有一个叫做地址族的。

    地址族和协议族其实是一样的,值也一样,都是用来识别不同协议的,为什么要搞两套东西呢?这是因为之前UNIX有两种风格系统:BSD系统和POSIX系统,对于BSD系统,一直用的是AF,对于POSIX系统,一直用的是PF。Linux作为后起之秀,为了兼容,所以两种都支持,这样两种风格的UNIX下的软件就可以在Linux上运行了。

    然后有了ipv4协议族,那么还有一个是数据传输方式,叫做socketType。

    理论上我们已经知道了是ipv4的协议族了,那么为什么有一个socketType呢?

    为什么有这样一个东西呢? ipv4 协议族我们知道了,有这么多协议。

    但是吧,这里并没有指明,用什么传输协议。

    比如说面向连接的套接字(socket_stream):

    有以下特点:

    1. 传输过程中数据不会消失
    2. 按序传输数据
    3. 传输的数据不存在边界

    传输的数据不存在边界,这个怎么说呢?

    就是说我可以把一个G的数据,我分为很多包来传输,虽然每次传输的都比较小,但是只要保证数据连接正常,我还是可以传输完成的。

    按序传输的,比如我要传输一篇文章,被分成了10个包,这些包是按照顺序传输的,也就是第一个包没有收到,第二个包就不会传输。

    传输过程数据不会消失,主要是讲究的其的可靠性。

    比如说包没收到会重发,包如果收到重复了会丢弃。

    一般两边都有缓存, 如果接收方无法缓存了,也会有相应的对策,让服务方能够重发收到。总之就是有一些措施能够让其数据稳定收到。

    另外还有一种比较出名的socketType是Sock_DGRAM。

    传输特点:

    1. 强调快速传输而非传输顺序
    2. 传输的数据可能丢失可能损毁
    3. 传输的数据有数据边界
    4. 限制每次传输的数据大小

    首先说一下数据边界,前面我们提及到Sock_Steam 说没有数据边界。

    这个我们说过,就是说其实就是每次传输的都很小,但是组装理论上可以无限大。

    而这个Sock_DGRAM 每次传输就是这么大,也就是数据只能这么多。

    Sock_DGRAM 也不会说等上一个传输完成,下一个才开始传输,其是无序的。

    除了socketType,那么还有一个叫做ProtocolType的。

    这是怎么回事呢?我们指定了协议族,指点了传输类型,为什么要指定ProtocolType呢?

    这是因为同一协议族中,可能存在多个传输类型相同的协议。

    不过再ipv4 中传输方式是Sock_Steam也就只要tcp了。

    而Sock_DGRAM 也就只有UDP了。

    这些大概就是设定一个socket的值了。

    接下来说一下ip,ip 地址有下面几类:

    A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。

    首位0开头的

    B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。

    首位10开头的

    C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。

    首位110开头的

    D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。

    E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。

    再说数据传输过程中,因为cpu的保存内存有大端序和小端序,这个可以自行去百度,那么网络传输中规定传输的都是大端序,这个需要注意。

    实际上,这个大端序和小端序的问题不用考虑我们发送的消息,一般send会做自动转换。

    但是只有bind的时候和connect的时候需要注意,因为这个是写入到操作系统中,不会做转换,就需要注意一下。

    上面这个不绝对哈,看语言的,有些会帮忙转的。

    下一结编写一个完整的tcp服务端和客户端,后面就是一直根据编写的代码,介绍会有什么问题,然后做改造。

  • 相关阅读:
    css中position的两种定位(absolute、relative)
    C# 如何转换生成长整型的时间
    C# 如何转换生成长整型的时间
    C# 如何转换生成长整型的时间
    easyui dialog的一个小坑
    easyui dialog的一个小坑
    ACM2027
    [VUE]关于路由哪些事儿
    hexo+github
    我们一起学React Native(一):环境配置
  • 原文地址:https://www.cnblogs.com/aoximin/p/15859996.html
Copyright © 2020-2023  润新知