初步理解socket
近期研究下socket,发现自己还是有非常多不明确的地方,索性沉下心来,从最基础開始学习,開始看起,如今对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正。
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地址、协议、port号。事实上这是TCP/IP协议提供的解决方案,网络层的ip地址能够唯一标识网络中的主机。传输层的协议+port能够唯一标识主机中的应用程序。
socket的通信流程
server为socket绑定ip地址和port号
serversocket监听port号请求,随时准备接收client发来的连接,这时候server的socket并没有被打开
client创建socket
client打开socket,依据serverip地址和port号试图连接serversocket
serversocket接收到clientsocket请求,被动打开,開始接收client请求,直到client返回连接信息。这时候socket进入堵塞状态,所谓堵塞即accept()方法一直到client返回连接信息后才返回,開始接收下一个client谅解请求
client连接成功,向server发送连接状态信息
serveraccept方法返回,连接成功
client向socket写入信息
server读取信息
client关闭
server端关闭
有名的三次握手
第二次握手:server接收clientsyn包并确认(ack=j+1),同一时候向client发送一个SYN包(syn=k),即SYN+ACK包,此时server进入SYN_RECV状态
第三次握手:第三次握手:client收到server的SYN+ACK包,向server发送确认包ACK(ack=k+1),此包发送完毕,client和server进入ESTABLISHED状态,完毕三次握手
定眼一看,serversocket与clientsocket建立连接的部分事实上就是大名鼎鼎的三次握手:
socket编程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:地址的长度
int listen(int sockfd, int backlog);
sockfd:要监听的socket描写叙述字
backlog:对应socket能够排队的最大连接个数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
连接某个socket
sockfd:client的socket描写叙述字
addr:server的socket地址
addrlen:socket地址的长度
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
TCPserver监听到client请求之后,调用accept()函数取接收请求
sockfd:server的socket描写叙述字
addr:client的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的时候,触发TCPclient向server发送终止连接请求。
初步理解socket的更多相关文章
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- 简单理解Socket
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- Graph Cuts初步理解
一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...
- [转]简单理解Socket
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
- socket.io,理解socket.io
原文:http://www.cnblogs.com/xiezhengcai/p/3957314.html 要理解socket.io ,不得不谈谈websocket 在html5之前,因为http协议是 ...
- 【转】 简单理解Socket
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- 【转】简单理解socket
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
随机推荐
- LightOJ 1074 Extended Traffic(spfa+dfs标记负环上的点)
题目链接:https://cn.vjudge.net/contest/189021#problem/O 题目大意:有n个站点,每个站点都有一个busyness,从站点A到站点B的花费为(busynes ...
- 实现celery中出现拥挤队列时,及时发邮件通知
里面有几个常用的功能,以后值得借鉴. 如获取脚本目录,IP,获取shell返回值,发送邮件等.. 上午写完,中午测试,下午上线~~ #!/usr/bin/env python # -*- coding ...
- 获取 web 项目的绝对路径
获取 web 项目的绝对路径 <% String path = request.getContextPath(); String basePath = request.getScheme()+& ...
- 【C#】利用反射构建实体
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- jquery DOM操作(一)
上一篇文章是记录了jquery中选择器的作用,这里只要记录下jquery中的DOM操作,还是按照上篇的格式来. 下面是测试用的html代码,接下来DOM的操作会在下面的代码下进行. <body& ...
- export导出.xls时,在火狐的情况下出现表名乱码的情况的解决方案
response.setContentType("application/octet-stream; charset=utf-8");fileName = exportDataDt ...
- debug id
id是Eclipse的debugger自己生成的,用于告诉你哪些变量是指向同一个对象:id相同即指向同一个对象. primitive不是对象,所以就没有id. 但是如果你用primitive的wrap ...
- javascript的优缺点和内置对象
1)优点:简单易用,与Java有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标: ...
- 导航控制器(UINavigationController)
导航控制器管理一系列显示层次型信息的场景.它创建一个视图管理器"栈",栈底为根视图控制器,用户在场景间切换时,依次将试图控制器压入栈中,且当前场景的试图控制器位于栈顶.要返回上一级 ...
- hdu dp 1257 最小拦截系统
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...