`
jesson.lv
  • 浏览: 40980 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

初步理解socket

 
阅读更多

最近研究下socket,发现自己还是有很多不明白的地方,索性沉下心来,从最基础开始学习,开始看起,现在对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正。

原创文章,转载请注明出处:http://blog.csdn.net/jessonlv

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、smtp、dns、telnet等
传输层:tcp和udp
网络层:IP ICMP OSPF EIGRP IGMP
链路层:SLIP CSLIP PPP MTU

看图说话:


在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作:


socket

如何唯一标识一个进程
利用三元组:ip地址、协议、端口号。其实这是TCP/IP协议提供的解决方式,网络层的ip地址可以唯一标识网络中的主机。传输层的协议+端口可以唯一标识主机中的应用程序。
在能唯一标识进程后,就可以进行socket通信了,socket是基于unix的一种“open--write/read--close”模式的一种实现。它把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

主要参考java api:
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客户端向服务器发送终止连接请求。


分享到:
评论

相关推荐

    一个简单的socket客户端发送消息到服务器端程序

    最基本的功能,能够帮助初学者初步理解socket

    socket套接字编程

    1、熟悉socket编程接口,初步掌握用socket编程接口开发面向连接的网络应用程序的方法,并且能较好的理解、掌握TCP/IP协议,熟悉VC++编程方法及编程环境; 2、初步掌握用socket编程接口开发无连接的网络应用程序的...

    socket接口网络编程实验指导

    1、熟悉socket编程接口,初步掌握用socket编程接口开发面向连接的网络应用程序的方法,并且能较好的理解、掌握TCP/IP协议,熟悉VC++编程方法及编程环境; 2、初步掌握用socket编程接口开发无连接的网络应用程序的...

    Lab2_171830635_俞星凯1

    1. 学习 socket 相关知识 2. 通过学习 ip,icmp,arp 的报文格式来理解这些协议的功能和作用 3. 掌握初步 raw sockt 编程基础

    TCP文件传输的设计与实现.zip

    在MFC中创建一个TCP传输数据的EXE,目前只能传数据,传文件还要改正。...通过文件传输程序的设计,加深学生对TCP原理的理解,使同学们初步掌握Windows 环境下使用Socket 开发的方法,培养学生综合思考与设计能力。

    Delphi_深度编程

    基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建DLL应用程序、两层数据库应用程序、多层数据库应用程序、Socket编程、串口编程;...

    C++Builder 6.0设计师之路 pdf版

    1.1 初步认识c++基本功 1.2 类型和表达式 1.3 控制结构 1.4 指针和数组 1.5 函数 1.6 结构和枚举 第2章 如何实现面向对象编程 2.1 类和对象 2.2 友元类和友元函数 2.3 类的继承 2.4 多态和虚函数 第3章 异常处理3.1 ...

    [14本经典Android开发教程]-5-linux Android基础知识总结

    9. linux 内核的初步理解 -------------------------------------------------------- 已上传4本: [14本经典Android开发教程]-1-Android开发从入门到精通 http://download.csdn.net/detail/cleopard/8355245 [14本...

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建DLL应用程序、两层数据库应用程序、多层数据库应用程序、Socket编程、串口编程;...

    VC学习大纲 VC学习讲义

    讲述如何运用ClassWizard及对MFC消息响应函数机制的分析,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 ...

    Android开发艺术探索

     2.4.6 使用Socket / 103  2.5 Binder连接池 / 112  2.6 选用合适的IPC方式 / 121  第3章 View的事件体系 / 122  3.1 View基础知识 / 122  3.1.1 什么是View / 123  3.1.2 View的位置参数 / 123  3.1.3 ...

    NtyTCP-v1.0.0-comments:用户态的TCPIP协议栈并包含了epoll技术实现原始代码,注释将不断维护,以保证质量-源码包

    :smiling_face_with_smiling_eyes:感谢王博靖前辈的开源精神,让我对epoll实现原理有了深刻的理解,在这里对他表示非常的感谢! 一,目录介绍 (后期补充) 二,整体框架 (后期补充) 三,更细日志 1、2019-10-25 ...

    android开发艺术探索高清完整版PDF

    71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 View的事件体系 / 122 3.1 View基础知识 / 122 3.1.1 什么是View / 123 3.1.2 View...

    传智播客扫地僧视频讲义源码

    20_案例_数组模板类_需求和类的初步设计 21_案例_数组模板类_测试框架搭建 22_案例_数组模板类_类的实现和测试_传智扫地僧 23_案例_数组模板类_数组元素存储的是类对象思想抛砖_传智扫地僧 24_作业 代码 文档 01_...

    2018吉林大学c++课设源代码压缩包

    加深对面向对象程序设计课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,深刻体会面向对象的编程思想,掌握使用面向对象程序设计语言C++,学会编写结构清晰、风格良好的C++语言程序,从而具备利用...

    JAVA基础课程讲义

    基于TCP协议的SOCKET编程和通信 193 UDP通讯的实现 201 思考作业 203 上机作业(分组完成,3人一组,周末完成) 204 第十一章 JAVA多媒体编程 205 字体 205 字体示例和效果 205 颜色 206 颜色编程示例 206 图形绘制 ...

Global site tag (gtag.js) - Google Analytics