每个程序员必看的TCP/IP,socket通信

学习目标:

  • 掌握TCP/IP的原理,以及涉及到的高并发负载均衡,集群的概念
  • 掌握socket通信原理,实现客户机与服务器间通信

TCP/IP协议

什么是协议?

“协议”是一种约定。
计算机之间传输媒介是光信号和电信号,通过“频率“和”“强弱”来表示0、1这样的信息,想要传递不同的信息,需要约定好双方的数据格式。
网络协议是一个共同标准,大家都来遵守。
为了让两台主机通信,需要协议和标准的数据格式才能进行通信。通过协议分层便于封装

OSI 七层网络模型

首先OSI是很基础但又非常重要的网络基础知识,理解得透彻对运维工程师和渗透工程师来说非常有帮助,同时理解了基本的OSI 7层网络结构对于理解tcp来说很重要。

七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。

注意:上面的七层是各个功能的抽象概念,是不可物理实现的,真正可物理实现的是TCP/IP模型,(注意区分TCP/IP模型和TCP协议)该模型将OSI中的应用层、会话层、表示层合并,TCP/IP支持所有标准的数据链路层和物理层协议。具体如下图所示:

TCP/IP模型

浅谈TCP/IP模型 - 知乎 (zhihu.com)icon-default.png?t=M85Bhttps://zhuanlan.zhihu.com/p/42224106其中下面四层一般都是基于公共内核(如Linux)实现,应用层基于各种程序,应用(app)实现,更具体的讲,传输层和网络层的封装在操作系统完成。应用层的封装在应用程序中完成。数据链路层和物理层的封装在设备驱动程序与网络接口中完成。

一般而言:
* 对于一台主机,它的操作系统内核实现了传输层到物理层的内容
* 对于一台路由器,它实现了从网络层到物理层
* 对于一台交换机,它实现了由数据链路层到物理层
* 对于集线器,他只实现了物理层。

网络分层即信息交互在linux中的体现

我们要理解网络中进程如何通信已经信息的交互,得解决两个问题:
  a、我们要如何标识一台主机,即怎样确定我们将要通信的进程是在那一台主机上运行。
  b、我们要如何标识唯一进程,本地通过pid标识,网络中应该怎样标识?
解决办法:
  a、TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机
  b、传输层的“协议+端口”可以唯一标识主机中的应用程序(进程),因此,我们利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

下面我们用Linux来体会网络分层的感觉:

  • 利用Linux nc命令用于设置路由器,实现路由器与百度的连接(传输层->tcp协议),但是整个连接的完成(传输层到物理层)是由linux内核实现的,你写的建立连接代码只是一小部分,剩下的内核自己完成。

nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
  • 接着利用netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。 

  •  我们来获取百度的主页信息(属于应用层的交互->http协议),利用

Linux命令发送Http GET/POST请求icon-default.png?t=M85Bhttps://www.cnblogs.com/kaleidoscope/p/9719841.html 

回车!

但是你自己用浏览器浏览百度的时候可没有这么复杂吧~,因为你使用的浏览器已经帮你做好了这一切, 我们刚才只是以人的形式代替了浏览器完成了这一部分的工作。

内核如何建立连接

接下来我们就讲一下当你使用nc与服务器建立连接的时候,整个TCP/IP模型的每一层都在干什么

每一层都呼叫它的下一层提供的网络来完成自己的需求。(如果是四层模型数据链路层和物理层在一层)

  1. 应用层:负责应用程序之间的沟通。网络编程主要针对的就是应用层。 
  2. 传输控制层:负责两台主机之间的数据传输,TCP、UDP,其中TCP(面向连接的,可靠的)

        TCP面向连接的可靠的是啥?

         三次握手——>数据传输——>四次分手

  • 首先是三次握手,建立连接之后,双方开辟资源(各自的内存中)建立连接(数据包的交互)。然而开辟出来的资源就是socket,作为程序员,你只需要让你的程序和自己机器进行交互,像不同设备间三次握手建立tcp连接都是由内核自己去实现。   
  •      然后是四次分手

    3. 网络层:负责地址管理和路由选择。路由器工作在网络层。

    4. 数据链路层:负责设备之间的数据帧的传输和识别。交换机工作在数据链路层。例如网卡设备的驱动,帧同步,冲突检测,数据差错校验等工作。

     5. 物理层:负责光电信号传递方式。集线器工作在物理层。以太网协议。

传输层和网络层的封装在操作系统完成。应用层的封装在应用程序中完成。数据链路层和物理层的封装在设备驱动程序与网络接口中完成。

socket(套接字)

什么是Socket

在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据
  socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
  我的理解就是Socket就是该模式的一个实现:即socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
  Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

可以参考我的另外一个博客(82条消息) TCP传输学习记录_༜黎明之光༜的博客-CSDN博客

简言之,套接字就是四元组,即源ip+端口port 目的ip+端口port,表示绝对唯一的连接。实际上,Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。一个网卡最多能建立65535个连接,当你想要提高连接数,不妨再加几个网卡来实现更高的连接数。

socket在TCP三次握手和四次分手中的体现

TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:

[Shake 1] 套接字A:“你好,套接字B,我这里有数据要传送给你,建立连接吧。”
[Shake 2] 套接字B:“好的,我这边已准备就绪。”
[Shake 3] 套接字A:“谢谢你受理我的请求。

建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。
断开连接需要四次握手,可以形象的比喻为下面的对话:

[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
等待片刻后……
[Shake 3] 套接字B:“我准备好了,可以断开连接了。”
[Shake 4] 套接字A:“好的,谢谢合作。”

以我们客户端和服务器进行TCP通信为例

服务器服务器启动监听socket,来监听本地是否有用户来访问其监听的地址(接收访问请求)

        理解:无论是谁访问我本地的ip地址端口号为3306,都统一转给这个监听进程,然后通过socket实现二者端到端通信

 

参考:

一、Socket技术详解 - 简书 (jianshu.com)icon-default.png?t=M85Bhttps://www.jianshu.com/p/066d99da7cbd5-传输数据:socket详解_哔哩哔哩_bilibiliicon-default.png?t=M85Bhttps://www.bilibili.com/video/BV1Br4y1h7gP/?p=5&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=71acea6682c8121539b919e1e8ca93ef

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值