前言

本文不会去介绍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服务端和客户端,后面就是一直根据编写的代码,介绍会有什么问题,然后做改造。

计算机网络再次整理————tcp[二]的更多相关文章

  1. 计算机网络再次整理————tcp周边[八]

    前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...

  2. 计算机网络再次整理————tcp例子第二前奏[四]

    前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...

  3. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...

  4. 计算机网络再次整理————tcp的关闭[七]

    前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...

  5. 计算机网络再次整理————tcp例子前奏[三]

    前言 简单编写一下tcp例子. 正文 我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层. 首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢? 首先要抛开有操作系统的意识 ...

  6. 计算机网络再次整理————socket[一]

    前言 以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下. 正文 这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.ht ...

  7. 计算机网络再次整理————UDP例子[六]

    前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...

  8. 计算机网络基础之TCP/IP 协议栈

    计算机网络基础之TCP/IP 协议栈 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.TCP/IP 协议栈概述 1>.什么是TCP/IP协议栈 Transmission C ...

  9. Touch事件or手机卫士面试题整理回答(二)

    Touch事件or手机卫士面试题整理回答(二) 自定义控件 1. Touch事件的传递机制 顶级View->父View->子View,不处理逆向返回 OnInterceptTouchEve ...

随机推荐

  1. 【LeetCode】877. Stone Game 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 双函数 单函数 + 记忆化递归 动态规划 日期 ...

  2. 【剑指Offer】链表中环的入口结点 解题报告(Python)

    [剑指Offer]链表中环的入口结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  3. 离线版centos8安装docker笔记

    嗨嗨哈哈,已经很久没有坐下来胡编乱造一点笔记了,平时云服务器搞惯了,一个命令就安装好了docker了的,但这次生不逢时的新机房就没那么幸运了,有多不逢时超乎想象,不仅仅服务器没有外网,就连周围方圆一公 ...

  4. C++判断月份天数(判断闰年)

    题目描述 输入年份和月份,输出这一年的这一月有多少天.需要考虑闰年. 输入格式 无 输出格式 无 输入输出样例 输入 #1 输出 #1 1926 8 31 输入 #2 输出 #2 2000 2 29 ...

  5. CS5218|DP转HDMI4K30HZ方案|CS5218应用方案

    Capstone CS5218是一款单端口HDMI/DVI电平移位器/中继器,具有重新定时功能.它支持交流和直流耦合信号高达3.0-Gbps的操作与可编程均衡和抖动清洗.它包括2路双模DP电缆适配器寄 ...

  6. 【MySQL作业】连接查询——美和易思内连接查询应用习题

    点击打开所使用到的数据库>>> 1.使用内连接获取客户"王传华"所有的订单信息和客户信息. 使用内连接获取客户"王传华"所有的订单信息和客户信 ...

  7. ECMA-262规范定义的七种错误类型

    第一种:Error    所有错误的基本类型,实际上不会被抛出.   第二种:EvalError   执行eval错误时抛出. 第三种:ReferenceError    对象不存在是抛出. 第四种: ...

  8. 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据

    通过requests.re(正则表达式) 爬取"古诗文"网页数据. 详细代码如下: #!/user/bin env python # author:Simple-Sir # tim ...

  9. JMeter_请求header

    在接口调试的时候,请求参数确认正确无误,但是请求失败! 通过对比header,发现header缺少一些字段(token)以及传入的值不正确(Content-Type) 增加这些字段信息后,接口调试成功 ...

  10. vue-router 两个子路由之间相互跳转时出错

    patient页面跳转到apply页面后,再点击patient页面后无法跳回 解决方法:使用`${path + path1}` 来自为知笔记(Wiz)