一、前言
对TCP/IP、UDP、Socket,套接字这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:
- 什么是TCP/IP、UDP?
- TCP、UDP的区别是?
- 什么是三次握手?
- Socket在哪里呢?
- Socket是什么呢?
- 你会使用它们吗?
- 计算机网络分多少个层次?
- 线程和进程的区别是?
- 内存池,进程池,线程池是?
- TCP断开连接的具体过程,其中每一步是为什么那么做 ?
- 传输控制层,网络层,数据链路层是什么?
- 数据传输的一系列流程是什么?
- 应用层中的App上位机软件是怎么跟服务器交互的?
二、正文
OSI 7层模式 如下 ↓↓↓↓↓↓↓↓↓↓↓↓
首先要从计算机底层的分层开始讲起。俗称OSI 7层参考模型。计算机一共分为7层每一层管理相应的职能。计算机分层主要是达到解耦的目的。层与层之间是可以有接口调用的。
- 应用层
- 表示层
- 会话层
- 传输控制层
- 网络层
- 数据链路层
- 物理层
今天这一章节讲解的是Socket的底层原理,表示层与会话层被应用层都包含起来了,那么我们就从包含之后开始叙述。应用层我们都熟悉,就是基于应用层做的一系列开发调的一些API函数。
- 应用层
- 传输控制层
- 网络层
- 数据链路层
- 物理层
三、传输控制层 如下 ↓↓↓↓↓↓↓↓↓↓↓↓
平时开发中数据库连接的时候就是一个Socket连接,Socket连接也就是计算机底层的IO输入输出,那么就出现了问题 如果两个Send发送给一个数据源应该建立几个连接呢?还是可以建立一个连接?
通过Linux的nc指令 与百度的80端口建立连接,连接之后看下图。多了一个nc的连接。所以问题来了nc到底是一个什么东西?为什么可以与百度的80端口建立连接呢?
Linux下nc连接的作用是
- 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
- 端口的扫描,nc可以作为client发起TCP或UDP连接
- 机器之间传输文件
- 机器之间网络测速
通过如下图继续详细的介绍吧。应用层的app想与别人建立连接的流程是
- 经过kemel内核的传输控制层(内核是什么东西向上翻阅一下)
- 利用传输控制层的TCP进行操作,下图讲解了什么是TCP!
- 很多文章都写发完三次握手包就已经完成创建了或者说是已经连接成功了,其实是不对的 ,双方建立连接之后必须是建立双方的资源之后才算是正常的建立连接 。如下图
- xshell效果图已经放在该图的下面。Recv-Q与Send-Q是两个建立连接的资源队列,应用层中的程序取数据时都是从这里取的。
- 资源建立完成之后 也就是我们应用层的在new Socket的时候返回了一个socket。
- 资源创建完成之后 完成了三次握手 下面就开始Send发送数据了,发送数据也是一样的,数据放入资源队列,如果服务端也想发送数据也是放入服务端的资源队列。这样就是两个资源队列的操作来回操作了。这样操作的好处与目的是解耦了与下面连接的虚无的这个过程。
- 四次分手 -> 释放端口号-> 释放资源(四次分手这里简单看一下,后面会有专门讲解四次分手的流程)
什么是Socket?
- 我这里不讲具体的一大串的含义,想看的百度搜 什么是Socket 找百度百科就可以了!我这里只给出干货!
- Socket是一个套接字,它是一个四元组。什么是四元组呢?如下图↓↓↓↓
- 比如举个例子:现在的浏览器都支持多个标签页,为什么每个标签页中的百度谷歌搜索不同的问题的时候,百度返回来的内容体为什么没有显示错呢? 这个就是和Socket有关!
- IP代表着某一个主机的地址,Port的作用是 寻找一个主机中无数个进程中的一个。 一个主机中有65535个端口号。那么问题来了 IPA连接IPB的同时可以连接IPC吗?
IPA连接IPB的同时可以连接IPC吗? 如下图↓↓↓↓↓↓
- 再向外界发送数据包时,只要返回的数据包能确认是张三还是李四就即可,所以四元组中也可以理解成 对象中嵌入一个List列表。好比我们做数据库主表外表一对多的时候 通过对象取里面的list列表,再从list列表中取对应的下标值一样。
- 所以 IPA:1+IPB:80与IPA:1+IPC:80是可以区分出来的!目标地址不同 所以是12万
一个电脑是否有两个一样的端口号?加网卡!
- 答案是可以的
- 我的电脑有两个IP地址 一个是物理地址一个是本地地址,做了以下的程序测试
- 这块讲解的不太明细 请谅解! 这里是通过视频学的 做的一些程序测试都不存在了 这里了解就好
四次分手流程(四次分手就是释放资源的一个过程) 如下↓↓↓↓↓↓
- FIN代表开始分手了,知会你一声
- Fin+Ack代表我知道了这件事
- Fin代表我同意了并且我也想跟你分手
- Ack代表确定完毕即将等待超时释放资源
- 完成分手
补充一下数据发送的细节并且稍微普及一下DDOS
- 发送请求之后 服务端给我们返回一个syn,syn的大小是由当前的MTU绝对的。MTU是最大的传输单元,普遍大小是1500。如果一次传输的数据大于1500则分多次发送,大家可以利用抓包指令监控包的情况。先安装tcpdump。
- Linux的指令是 tcpdump -nn -i etho port 80 。 nn代表不把地址转换成名字 80代表抓哪个端口的包,具体的详细指令请 Linux抓包指令参考
- 下图是数据发送的一个流程 ①.首先向百度发一个握手的请求包,②.百度向本地回了一个同意包,③.本地向百度回一个收到确认包开始交易。④.本地先向百度发送一个当前浏览器支持哪些算法的列表包,所以是168字节。⑤.1460和1321是两次内容包,一次发不完所以分两次。⑥.之后本地又向百度发一个ack的确认包,告诉百度当前内容已收到。并且开始四次分手 ⑦.本地向百度请求分手,⑧.百度告诉本地收到了并且我 也请求分手。⑨.最后本地向百度请求ack确认包 结束当前操作! 分手完毕!
- ddos是分布式拒绝服务。
四、网络层 如下↓↓↓↓↓↓
通过如下图我们讲述的知识是:
- IP:ip地址是由子网掩码生成的,通过二进制按位与运算的方式。它是4个字节,8个位,每一位的范围是0-255。换算流程以及广播地址的换算,网络地址的换算如下图↓↓↓↓
- Router:计算机底层的路由表,数据转发是通过路由表走的。Linux输入router -n 。 结合下图下表
- DNS
- 子网掩码
- 网关:网关是什么?举个例子,相当于古代一个当官家庭的大人,妻子或者下人所有官场上的反馈与传达什么意思都要依靠这个父亲。网关也是这样,一个局域网中的所有数据想要发送到外网中必须依靠这个网关。
- 网络层的工作原理流程
Destination | Gateway | Genmask | Flages | Metric | Ref | Use | IFace |
0.0.0.0 | 172.17.111.253 | 0.0.0.0 | UG | 100 | 0 | 0 | ehto |
172.17.96.0 | 0.0.0.0 | 255.255.240.0 | U | 100 | 0 | 0 | ehto |
为路由目标,可以是网络或者主机的IP地址 | 包含默认的网关或通过其可访问主机或网络的网关 | 包含网关后的网络或主机的子网掩码 | 表示该条路由从哪个设备出去 |
网络层的工作原理(发给谁拿谁的IP地址与路由表子网掩码的Genmask做二进制按位与):
- 例子百度IP:220.181.38.149 子网掩码:255.255.255.0
- 二进制百度:11011100.10110101.00100110.10010101
- 二进制子网:11111111.11111111.11111111.00000000
- ①百度的IP通过按位与子网的结果与destination作比较。如果正确就发出到GateWay到网关,如果错误下一条路由继续处理。②如果是局域网传输主机A按位与子网的结果与destination作比较如果符合直接校验网关,当网关是0.0.0.0时说明放行一切数据,说明局域网传输不需要网关。 所以直接转发到目标IP。③ 接①搭配下图继续聊。如果正确发出到GateWay网关后它的数据包中都包含着哪些数据呢?看图!
- 如图得知 下面走到了数据链路层!
网络层的作用:寻找网关地址或者不通过网关直接内外转发。网络层只关心谁到谁的位置。
五、数据链路层 如下↓↓↓↓↓↓↓
方便理解,给出一个不权威的解释。
- 客户端制造Syn包发送到网关
- 网关根据MAC地址收到后判断目标IP地址发现不是自己的,于是进行转发给上一级网关,也就是节点B,并且修改MAC地址为节点B的IP
- 光纤运营商根据MAC地址收到后,判断目标IP地址,发现也不是自己的,于是再次进行转发给上一级网关也就是节点C,并且修改MAC地址为节点C的IP
- 企业接入网光纤根据MAC的地址收到后判断目标IP地址,发现不是自己的,于是进行转发到公司服务器也就是端点B。并且修改MAC地址为端口B的IP
- 百度服务器端(端点B)收到后,判断目标IP地址发现是自己的于是收下。
六、最后总结一下总体流程
- 先请求MAC地址,如果有就开始三次握手接下来按照上面就通了。
- 没有的话要先通过ARP协议请求一个数据链路层的硬件地址,拿到之后就可以执行①的操作了
- 用程序校验一下↓↓↓↓↓
- ①对80端口的抓包,②抓包之前我把地址删掉了所以这里会先请求一遍ARP协议拿到硬件地址返回了00:50:56:f7:53:2b,这里是广播的发给了局域网的所有人,但是只有192.168.150.2才能给我返回③拿到之后开始三次握手,④发收内容体包,⑤最后四次分手断开
七、面试技巧流程
自我介绍什么的我就不说了,只说一下技术,拿Socket举例。
常见的小白场景就是
面试官:简单的介绍一下Socket 应聘人:你好面试官,不好意思我没用过,好像是通信用的。
常见的初级场景就是。
面试官:简单的介绍一下Socket 应聘人:你好面试官,Socket是一个安全套接字,用于通信。一个发送点一个接收点,有多种通信协议比如UDP/TCP,TCP是三次握手,UDP是不用握手的。UDP比TCP更高效。如果需要交互判断的选择TCP,如果不需要交互判断的选择UDP。
以上没有加分项,或许你可以这样,中级场景
面试官:简单的介绍一下Socket 应聘人:你好面试官,Socket我了解的是: A=>安全套接字,要想聊Socket就要深入计算机底层我们可以从OSI7层模型说起,描述每一层的作用。 B=>TCP是什么,告诉面试官为什么是面向连接的可靠的传输协议。TCP三次握手都做了哪些事情比如Syn包,Ack包,Syn+Ack包。 C=> 通过交互流程可以展开ddos简单介绍一下表明你懂的比较多。你是个有干货的人,你是个对技术敏感的人。乐于学习的人
告诉面试官Socket在每一层都做了什么以及Socket通信的时候是如何和外界联系的【加分项】