目录
Socket套接字
1.概念
2.分类
1.TCP和UDP:
特点:
(1)有连接 VS 无连接
(2)可靠传输 VS 不可靠传输
丢包:
为啥会出现丢包?
如何对抗丢包?
(3)面向字节流 VS 面向数据报
(4)全双工 VS 半双工
💡 上篇文章网络原理学习了:
1.网络的核心概念
2.封装分用流程
3.TCP/IP哪五层+每层干啥的(需倒背如流)
问题:当数据交给上一层的时候,是由哪个协议负责进行解析的呢?eg:数据链路层到网络层传输时,是交给ipv4还是ipv6呢?网络层传输到传输层,交给TCP解析还是UDP呢?
答:每个协议报头中都包含对应的信息,告诉你上一层是要交给哪个协议来处理的,不能自己决定的
网络编程套接字,也就是跨主机通信
一、Socket套接字
1.概念
操作系统提供的网络编程的API称为‘socket api”
目前:见到socket这个词,就可以认为是”网络编程的API“的统称
2.分类
操作系统提供的socket api其实不只有一套,而是有好几套~~
(1)流式套接字 =》给TCP使用的
(2)数据报套接字 =》给UDP使用的
(3)Unix域套接字 =》不能跨主机通信,只是本地主机上的进程和进程之间的通信方式(现在使用的很少了)
1.TCP和UDP:
TCP和UDP都是传输层协议,都是给应用层提供服务的
但是由于这两个协议,特点,差异非常大,因此我们需要搞两套api,来分别表示
💡 特点:
TCP:有连接,可靠传输,面向字节流,全双工
UDP:无连接,不可靠传输,面向数据报,全双工
💡 (1)有连接 VS 无连接
有连接:好比打电话,得电话接通了,然后才能说话
可以选择,接听,也可选择直接挂掉~
通信双方保存对方的信息
无连接:好比发信息,不需要“先接通”,直接上来就发
这个就无法拒绝了
💡易混淆概念:连接 VS 链接
两者无任何关系
连接:connection 抽象的概念
生活中的连接:拿个东西,把两个东西给栓起来
计算机中的连接:要建立连接的双方,各自保存对方的信息,就认为是建立了一个抽象的连接(eg:结婚证是一式两份,证上分别保存了对方的信息)
链接:Link
💡(2)可靠传输 VS 不可靠传输
首先要区分 可靠 != 安全
安全:你的传输的数据,是否容易被黑客截获掉,一旦被截获之后,是否会造成严重的影响
可靠:要传输的数据,尽可能的传输给对方
其次,只是尽可能做到数据到达对方,而不是确保,不是100%
在当前网络通信的过程中,可能会存在很多意外情况,比如,丢包
💡丢包:
A给B传输10个数据报,B实际上只收到9个(随机的过程)
无法预知,啥时候会丢包;哪个路由器/交换机会出现丢包
💡为啥会出现丢包?
网络环境太复杂,A传输给B,中间可能会经历很多的交换机和路由器,进行转发,这些交换机和路由器,也不只是转发你的数据,还有转发很多数据
比如,某个交换机/路由器,非常繁忙,繁忙到,要处理的数据量,已经超出了自身的硬件水平,此时,多出来的数据,就无法转发,会被直接丢弃掉
类似于交通网,某个路口,动不动就堵车
生活中,堵车,只能一点一点堵着
计算机中,出现上述拥堵的情况,可能直接把数据给丢弃
💡如何对抗丢包?
可靠传输:引入“可靠传输”,TCP就具备这样可靠的传输特点,内部提供了一系列的机制来实现可靠传输,即使如此,TCP也只能“尽可能”无法保证,数据报100%到达对端,极端情况下,会出现网线断开的i情况,即使你在软件上使用浑身解数,也无济于事
不可靠传输:UDP则是不可靠传输,传输数据的时候,不会关心对方是否收到,发就完了
💡易错点:TCP的可靠性归结于TCP是有连接的,这是错误的
两者没有必要的联系,互不相干
💡(3)面向字节流 VS 面向数据报
面向字节流:文件操作,就是字节流的(比喻成水流一样,读写操作非常灵活),TCP和文件操作,具有相同的特点(在代码提现出来都是一样的)
面向数据报:传输数据的基本单位,是一个一个的UDP数据报,一次读写,只能读写一个完整的UDP数据报,不能搞半个(对于写代码,影响非常明显)
💡 知识拓展:谈到,网络传输的基本单位,涉及到几个术语:
<1>数据报 Datagram (用于UDP时这样叫)
<2>数据段 Segment (用于TCP时这样叫)
<3>数据包 Packet (用于IP时这样叫)
<4>数据帧 Frame (用于数据链路层时这样叫)
其实这几个词是有区别的,但是一般程序员交流的时候都不会刻意的进行区分
💡 (4)全双工 VS 半双工
全双工:一条链路,能够进行双向通信(TCP,UDP都是全双工),后续代码中创建socket对象,既可以读(接受),也可以写(发送)
半双工 :一条链路,只能进行单向通信,要么接收,要么发送,不能同时进行
网络上,网线啥的,里面都是电信号,从这边进那边出,还是从那边进,这边出,都行
因为网线里头不是一根线,而是8根
上述是列出了TCP和UDP最直观的区别,后面还会对两者进行详细的介绍