什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
http请求底层也是基于socket的。 另外Socket也就是我们通常说的TCP的封装形式。
socket通信流程:
socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例:
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
三次握手
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手
Socket与服务端ServerSocket建立联系的三次握手过程:
(1)第一次握手:建立连接时,客户端Socket向服务端ServerSocket发送SYN包,并进入SYN_SEND状态,等待服务器B确认。这个过程,就好比我向你打电话,我的手机号通过信号到了你的手机上并显示 156XXXXXXXX来电,此时要等你确认这个手机号。
(2)第二次握手:此时服务端收到客户端的SYN包,与客户端的SYN进行确认,确认后,服务端向客户端发送个SYN包,即SYN+ACK 包。服务端进入SYN_RECV状态。这个过程就好比,当收到某人的来电后,我确认手机号是我的朋友,此时我要接通他的电话。
(3)第三次握手:客户端收到服务端发送过来的SYN + ACK包,此时客户端像服务端再发送一个ACK确认包。此时发送完毕后,客户端与服务端就进入了ESTABLISHED状态,完成通信前的三次握手。这个过程就好比,当我接通了电话后,我问对方是XXX吗?对方说是的!(妈的,终于可以交流了。。。)
相关推荐
本地socket通信的简单实现demo,通过此demo理解Android源码中的socket通信逻辑
socket通信有关资料 适合初级学习使用 简单 容易理解 能够快速掌握socket通信精髓
该文档是我自己整理的 java和c# 使用socket通信。 java为客户端,c#为服务器端。也可以调换过来。。代码很容易理解。
用Java编写的简易聊天工具,使用AIO实现非阻塞socket通信,对理解非阻塞socket通信有很多帮助。
1.利用 WinSock 来实现双机通信,理解 TCP 状态机图。 2.要求使用 WinSock 编程,采用其中的 TCP 面向连接方式,实现文本数据的交 换。
实验三Socket通信实验报告 (1)实验目的和要求 1. 掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法; 2. 掌握客户/服务器(C/S)应用的工作方式; 3. 学习网络中进程之间通信的原理和实现方法; 4. 理解单...
利用WinSock来实现双机通信,理解TCP状态机图。 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。
1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的... 6,注意理解程序的线程、Socket的基本动作(Accept、Connect、Send、Receive)等;
socket通信的一个例子,有助于对socket编程的理解。
非阻塞socket通信,非阻塞原理讲解,比喻形象,容易理解
讲解详细,步骤明确,便于理解,尤其是用于CSocket的初学者
自己开始学习socket时制作的一个多线程操作socket通信的案例,代码逻辑清晰,简略易懂,方便初学者学习,代码注释明确,易理解。
使用Java 最原始的Socket 方式逐步实现Http/Https 网络通信,加深对于网络协议的理解
内含5个socket的通信实例,实现客户端与服务端之间的信息交流,从简单到复杂,有模拟QQ通信功能,很好的让你理解socket通信。
本例子运用C#中的Socket类进行以太网同步通信,里面有服务器和客户端界面,可以传输文件和文字,代码有大量的注释,可以让初学者很好的理解socket TCP网络编程。
C#,基于UDP的Socket通信客户端,包含服务器端和客户端,有图形化界面,通过服务器IP连接,点对点通信,不支持一对多,功能上属于很简单的,演示和理解基于UDP的Socket通信原理有一定的帮助。
C#,基于TCP/IP的Socket通信客户端,包含服务器端和客户端,有图形化界面,通过服务器IP连接,是异步通信,非同步通信,点对点通信,不支持一对多,功能上属于很简单的,演示和理解基于TCP/IP的Socket通信原理有一定...
都是自己写的,每个人的理解方式都不一样,但是基本原理就是样的, 你可以在这个基础上扩展其他的功能。 直接打开就可以用,代码简单 清晰,一看就懂了那种,不满意你私信我。 都是自己写的,每个人的理解方式都不...
MFC工程通信经典实例,基于SOCKET UDP协议,有助于学习和理解UDP协议原理.
set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket...