博文转自:http://www.cnblogs.com/dolphinX/p/3460545.html
TCP/IP
要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,
从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的
估计有兴趣打开此文的同学都对此有一定了解了,加上我也是一知半解,所以就不详细解释,有兴趣同学可以上网上搜一下资料
在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作
socket
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket通信流程
socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送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编程API
前面提到socket是"打开—读/写—关闭"模式的实现,简单了解一下socket提供了哪些API供应用程序使用,还是以TCP协议为例,看看Unix下的socket API,其它语言都很类似(PHP甚至名字都几乎一样),这里我就简单解释一下方法作用和参数,具体使用有兴趣同学可以看看博客参考中的链接或者上网搜索
int socket(int domain, int type, int protocol);
根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。
domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址
type:socket类型,常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
把一个地址族中的特定地址赋给socket
sockfd:socket描述字,也就是socket引用
addr:要绑定给sockfd的协议地址
addrlen:地址的长度
通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
int listen(int sockfd, int backlog);
监听socket
sockfd:要监听的socket描述字
backlog:相应socket可以排队的最大连接个数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
连接某个socket
sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:socket地址的长度
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
TCP服务器监听到客户端请求之后,调用accept()函数取接收请求
sockfd:服务器的socket描述字
addr:客户端的socket地址
addrlen:socket地址的长度
ssize_t read(int fd, void *buf, size_t count);
读取socket内容
fd:socket描述字
buf:缓冲区
count:缓冲区长度
ssize_t write(int fd, const void *buf, size_t count);
向socket写入内容,其实就是发送内容
fd:socket描述字
buf:缓冲区
count:缓冲区长度
int close(int fd);
socket标记为以关闭 ,使相应socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。
参考
PS. 有同学看完后发现没有demo示例,参考中的示例已经很不错了,我就不班门弄斧了,而且我用C#实现了一个websocket server,接下来的博客中会有介绍。另外由于刚刚实际接触socket,文中谬误较多,还望大家批评指正,文章内容主要参考上面两个博文,图片全部来源于网络,在百度图片搜索得来,无法注明第一源地址,如有版权问题请站内信联系,第一时间处理。
相关推荐
在这个"socket简单实现程序"中,我们将探讨如何使用Socket在两台电脑之间构建基本的通信链路,以及涉及到的相关知识点。 首先,Socket是网络编程的基础,它提供了一种在网络中不同进程间通信的接口。在TCP/IP协议栈...
在这个“C# Socket简单聊天”项目中,我们将探讨如何利用C#的Socket类来创建一个既能作为客户端又能作为服务端的聊天程序。 Socket,又称为套接字,是网络通信的基本单元,它允许两个或多个设备之间进行数据交换。...
本文将深入探讨Android中如何简单地使用Socket进行TCP通信。 首先,理解Socket的基本概念至关重要。Socket,也被称为套接字,是网络编程中的一个抽象接口,它允许应用程序通过网络发送和接收数据。在TCP/IP模型中,...
本篇文章将深入探讨"C# socket简单实例",帮助新手快速掌握如何使用C#进行Socket编程。 Socket,通常被称为套接字,是网络编程中的一个抽象概念,它为进程间的通信提供了一个标准接口。在C#中,System.Net命名空间...
在IT行业中,网络编程是不可或缺的一...总的来说,"SOCKET简单示例"是一个很好的起点,让初学者能够深入理解网络通信的基础,为进一步学习网络编程,如HTTP、FTP等应用层协议,甚至更高级的网络编程技术打下坚实基础。
Java Socket 简单成绩管理系统是一个基于JAVA编程语言和Socket通信技术实现的初级项目,它主要目的是帮助初学者理解如何运用Socket进行网络通信,并在实际应用中管理学生的成绩。在这个系统中,通常会包含服务器端...
Socket编程是计算机网络编程中的重要组成部分,主要用于实现不同设备或进程间的通信。..."socket简单测试"就是一个很好的实践,通过编写和运行这段代码,你可以深入理解Socket的工作原理以及如何在实践中应用。
总的来说,这个"Socket通讯简单Demo"提供了一个基础的网络通信模型,让初学者可以通过实际操作理解Socket编程的基本流程和方法。通过阅读和运行这个Demo,你可以了解如何建立Socket连接、发送和接收数据,以及如何将...
总的来说,"SOCKET简单聊天实例.rar"是一个理想的起点,让初学者能够实践TCP SOCKET编程的基本概念,并理解网络通信的基本流程。通过这个实例,开发者不仅可以掌握如何建立和维护SOCKET连接,还能学习到如何结合...
总的来说,"VC编写的socket简单聊天程序"是一个基于VC和Winsock的初级示例,它可以帮助初学者理解Socket编程的基本概念,包括网络连接、数据交换以及简单的用户交互。虽然对于经验丰富的开发者来说,这个程序可能...
二、C# Socket简单案例 下面是一个简单的C# Socket客户端和服务端的交互示例: 服务端(Server): ```csharp using System; using System.Net; using System.Net.Sockets; class Server { static void Main() { ...
在描述中,"简单聊天程序vc,socket简单聊天程序vc,socket简单聊天程序vc,socket" 的重复可能是输入错误,但我们可以理解为强调这是一个使用VC和Socket技术创建的简单聊天应用。这个程序可能包含客户端和服务器两部分...
标题"delphi socket简单通讯demo"暗示我们将讨论如何在Delphi中创建一个基于Socket的简单通信示例。通常,这样的DEMO会包含一个客户端和一个服务器端,它们通过Socket连接进行数据传输。 在描述中提到的"delphi ...
本文将深入探讨PHP Socket的工作原理、实现流程以及如何通过PHP编写简单的Socket程序。 首先,理解PHP Socket的基本概念至关重要。Socket,又称为套接字,是网络编程中的一个重要组成部分。它是网络上两个程序间...
文档中可能包含了如何用C语言编写一个简单的服务器和客户端程序的示例,这些示例通过逐步引导的方式,帮助读者理解并掌握Socket编程。 ### 数据包Sockets、阻塞以及select()多路同步I/O 在Socket编程中,理解...
本篇文章将详细探讨如何在MFC框架下使用Socket进行简单通信。 首先,我们需要了解Socket的基本概念。Socket是操作系统提供的一种进程间通信(IPC)机制,它允许两个网络上的应用程序通过TCP/IP协议进行数据交换。在...
本文将深入探讨“Socket简单通信winform”的实现,以及如何实现文件发送和屏幕闪烁功能。 首先,Socket是基于TCP/IP协议的网络通信接口,它允许应用程序通过网络进行数据交换。在Winform应用中,我们可以使用C#语言...
Socket服务器是一种在网络编程中用于通信的机制,它允许两台计算机通过互联网进行数据交换。在本案例中,我们关注的是...结合Cocos2d-x的简单Socket服务器,我们可以更好地理解和实践网络编程,并提升游戏的开发质量。
在本文中,我们将深入探讨"简单的socket通信",包括服务端和客户端的基本概念、实现方式以及如何在Visual Studio 2015环境下进行开发。 首先,我们需要了解什么是Socket。Socket在计算机网络中是一个接口,它为应用...
首先,我们要理解什么是socket。在计算机网络中,socket是进程间通信的一种方式,它提供了一种连接到特定网络服务的方法。在PHP中,我们可以使用`socket_create()`函数创建一个socket,然后使用`socket_connect()`来...