Socket原理的简单理解

最近我在做一个android小项目用到了socket,今天整理了一下资料总结我对SOCKET的理解。
socket的使用就在我们生活中,只是不被我们关注而已,首先看看生活中哪些用到了socket:
网络中进程之间如何通信
当我们打开浏览器浏览网页时,浏览器的进程和web服务器通信的
当我们用QQ聊天时,QQ进程和服务器或好友所在的QQ进程通信
简单的说就是那里应用到网络那里就有socket
那什么是socket?在理解socket前,我们先来了解什么是TCP/IP

TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
从字面上看tcp/ip是tcp协议和ip协议的结合,其实TCP/IP是整个网络结构TCP/IP协议族
不同于OSI模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
TCP/IP协议和OSI模型的对比
注:有时候经常弄错ISO和OSI,下面给出这两个的全称即中文翻译
ISO(International Organization for Standardization )“国际标准化组织”。
OSI(Open System Interconnect)“开放式系统互联”

OSI模型这里就不细讲了,想要深入了解的可以在网上查找
下面我们看看TCP/IP协议的四个抽象成

Application(应用层):
TFTP(普通文件传输协议)
HTTP(超文本传输协议)
SNMP(简单网络管理协议)
FTP(文件传输协议)
SMTP(简单邮件传输协议)
DNS(域名服务器)
Telnet(远程登录) 等等

Transport(传输层):
TCP(传输控制协议)
UDP(用户数据报协议)

Network(网络层):
IP(互联网协议)
ICMP(网间控制报文协议)
IGMP(英特网组管协议)

Link(链路层):以太网,令牌环网,IEEE802.3等

TCP/IP协议模型的下一层是给上一层提供服务的
TCP/IP协议抽象层层间关系
TCP/IP通信协议模型
你从上面这两张图就知道了TCP/IP与UDP的关系了吧。那我们的socket小伙伴在那个位置呢?不要急!看下面这张图
Socket抽象层在TCP/IP协议层中的位置
图片摘自:
http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx
看到这里是不是就知道socket的位置了!!!
再贴上一图描述的是TCP/IP的数据的封装与传递过程
TCP/IP的数据的封装与传递过程
这张图清楚的讲解了TCP/IP的数据如何封装和传递方向
TCP/IP协议是一个大方向,我们就先说到这里。下面我们进入正题!
Socket
好我们先说说Socket是什么
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
太官方的答案?还是不懂?
好这里给出一个生活中的场景:你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。
生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,呵呵这也不一定。
前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
再简单点,socket就是“打开—读/写-—关闭”下面以TCP协议的Socket通信为例,先看下面这两张图:
server与client间socket通信流程图
图1
server与client间socket通信流程图
图2
图片摘自:
http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx
从图中可以很清楚看出server端和client端的socket打开->连接(通信)->关闭的过程

首先server端根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
————
然后绑定 socket和端口(端口自己定义,由于0~1023端口已经默认使用,防止端口冲突最好大于1024) 再开启监听
————
client端创建socket,然后根据server的ip和指定端口发起建立连接请求
————
当server接收到client连接请求被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求
————
客户端连接成功,向服务器发送连接状态信息
————
服务器accept方法返回,连接成功
————
客户端向socket写入信息
————
服务器读取信息
————
客户端关闭
————
服务器端关闭
————
注意:
主动打开和被动打开
在client/server模式下,连接的建立请求是由client发起的,它执行“主动打开”,而server执行“被动打开”,并对client的连接请求被动响应。
在server进程的实现中,首先让server执行“被动打开”,告诉其TCP要准备接受client进程的连接请求。然后server进程就处于“听(listen)”的状态,不断检测是否有client进程要发起连接请求。如有,即作出响应。

说到连接结合TCP的三次握手进行分析
TCP三次握手
图片摘自:http://blog.csdn.net/u013271921/article/details/45218703
想对tcp三次握手四次握手更多了解的可以查看这篇博文
握手过程
第一次握手:客户端尝试连接服务器,其首部中的比特同步SYN(同步序列编号Synchronize Sequence Numbers)置为1,同时选择一个序号(seq=x),客户端进入SYN_SEND状态等待服务器确认

第二次握手:服务器接收客户端syn包并确认(ack=x+1),同时向客户端发送一个SYN包(SYN=1),即SYN+ACK包,同时也为自己选择一个序号(seq=y),此时服务器进入SYN_RECV状态

第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,其确认序号为y+1,客户端和服务器进入ESTABLISHED状态,完成三次握手
对TCP连接过程就讲解这些需要深入了解的可以网上查找资料
至于SOCKET底层API涉及底层编程,像socket(),bind(),listen(),connect()等函数以及参数这里不阐述,感兴趣的童靴可以参考下面两篇博文(编程语言是C/C++)
揭开Socket编程的面纱
Linux Socket编程(不限Linux)
这里的重点是java官方提供的socket API的使用
篇幅太大,看下一篇

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值