首页 > 其他分享 >socket底层实现

socket底层实现

时间:2022-10-23 22:09:53浏览次数:56  
标签:socket 实现 TCP 发送 接字 底层 连接 Socket 客户端

网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象; 传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。http协议对应于应用层,是基于TCP连接的,主要解决如何包装数据;tcp/udp协议对应于传输层,主要解决数据如何在网络中传输;ip协议对应于网络层。 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 网络七层模型

##一、TCP

TCP是面向连接的、传输可靠(保证数据正确性且保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。TCP是一种流模式的协议,是面向连接的,也就是说,在连接持续的过程中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据不关心。

####TCP三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手

####三次握手建立连接 image.png

SYN(synchronous)是同步标志;ACK (Acknowledgement)是确认标志,seq是序列号。第一次握手:客户端发送一个TCP的SYN标志位置1的包,指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号字段里。

第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号设置为客户的序列号加1以,即X+1。

第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。

####TCP四次挥手

三次握手耳熟能详,四次挥手估计就不怎么明白了,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在socket编程中,这一过程由客户端或服务端任一方执行close来触发

四次挥手的流程: image.png

四次挥手关闭连接

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK态。

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程

同时挥手

注意

关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:

(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。

(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

##二、UDP

UDP是面向无连接、传输不可靠、用于传输少量数据(数据包模式)、速度快的传输层协议。注意,UDP传输的是数据报包,而TCP是流。

UDP是面向无连接的协议,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

##三、什么是Socket?

Socket又称之为“套接字”,是系统提供的用于网络通信的方法。它的实质并不是一种协议,没有规定计算机应当怎么样传递消息,只是给程序员提供了一个发送消息的接口,程序员使用这个接口提供的方法,发送与接收消息。

Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息。所以,Socket一定包含了通信的双方,即客户端(Client)与服务端(server)。

####Socket的通信过程

每一个应用或者说服务都有一个端口。比如DNS的端口号53,http的端口号80都是对应一个应用或者服务的端口。我们能由DNS请求到查询信息,是因为DNS服务器时时刻刻都在监听53端口,当收到我们的查询请求以后,就能够返回我们想要的IP信息。所以,从程序设计上来讲,应该包含以下步骤:

(1)服务端利用Socket监听端口;

(2)客户端发起连接;

(3)服务端返回信息,建立连接,开始通信;

(4)客户端,服务端断开连接。

####Socket原理

Socket是通讯的根本,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机地址的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了Socket接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

####Socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。

套接字之间的连接过程分为三个步骤:

(1)服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求

(2)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求

(3)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

####Socket-TCP

Socket传输的是字节流,AsyncSocke封装的库以NSData的形式传输。 image.png

####Socket-UDP image.png

标签:socket,实现,TCP,发送,接字,底层,连接,Socket,客户端
From: https://blog.51cto.com/u_15522232/5787591

相关文章

  • 手机点对点测试网络速度,这款软件轻松实现
    我们时常会有测试网络速度的需求,最常用的就是测试宽带的下载速度,比如网页使用"测速网"测试出当前带宽的下载速度和上传速度。同样的方法,我们也可以在手机上测试带宽速度。但......
  • destoon实现调用热门关键字的方法
    destoon调用热门关键字的方法是根据数据库里面的保存的搜索的关键字来显示的。每个模块下面都有各自的关键字下面是调用的标签:<!--{tag("moduleid=$searchid&table=keywor......
  • android实现网格布局
    效果图  添加依赖implementation'com.github.mtjsoft:GridPager:v3.7.0'layout文件<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="h......
  • android实现pdf阅读器
    添加依赖implementation'com.github.barteksc:android-pdf-viewer:3.1.0-beta.1'MainActivity文件importandroidx.appcompat.app.AppCompatActivity;importan......
  • 用递归实现整数拆分
    题目: 题目分析:将给定整数n无序拆分成最大数为k的拆分数,求拆分方案个数如当n=4,k=1时仅有一种拆分方法:4=1+1+1+1;当n=4,k=2时有:4=1+1+1+1;4=1+1+2;4=2+2;这三种拆分方法......
  • NETCORE - WebSocket通信
    NETCORE-WebSocket通信 webscoket 通信 一般为 客户端与服务端通信,如需两个服务端通信,可把其中一个服务端模拟成客户端。项目框架 vue+.net6 创建NET6 的......
  • ArrayList集合底层原理
    (1)利用空参创建的集合,在底层创建一个默认长度为0的数组;(2)添加第1个元素时,底层创建一个新的长度为10的数组;(3)存满时,会扩容1.5倍;(4)如果一次添加多个数据,1.5倍还放不下,则新创建......
  • Android实现类似微信的设置界面
    效果图  导入包implementation'de.hdodenhof:circleimageview:3.1.0'implementation'com.leon:lsettingviewlibrary:1.7.0'layout文件<?xmlversio......
  • android实现全局字体
    效果图  在theme中添加  <itemname="android:fontFamily">@font/a</item> res目录下面创建font,放入名字为a.ttf的字体在manifest中用这个theme即可全局......
  • 链表实现
    1.伪代码算法要插入一个节点,即将上一个节点指向的地址改为要插入的地址,将新的节点指向下一个节点即setnext(i)toqset*ptonext(i)setqtonext(p)要删除一......