首先我们先看一下socket的定义:是在传输层和应用层中间的一个抽象层,是实现网络通信的接口。

  那么什么是传输层,什么是应用层呢?网络又是怎样通信的呢?为了弄清这两个问题,我们需要弄清一个概念TCP/IP四层模型和OSI七层模型。

  

  OSI: Open System Interconnection的缩写,意为开放式系统互联。

  TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何在它们之间传输的标准。

  OSI七层模型是TCP四层模型的延申拓展,我们就简单了解一下这七层究竟是什么定义,每层负责什么。如果对这方面有兴趣的极客,可以google一下具体的详细资料。

  1.物理层:机械,电子,一些定时接口的比特流传输。

  2.数据链路层:实现物理寻址,将比特流实现按逻辑电路传输。

  3.网络层:控制子网的运行,路由的选择,将信号发送到哪里。

  4.传输层:接受下一层会话层的数据,有必要时对数据进行分割,传给网络层传输。

  5.会话层:不同机器上的客户建立会话通信。

  6.表示层:信息语法语义以及他们的关联,比如压缩,加密。

  7.应用层:各种应用程序协议,比如HTTP FTP SMTP。

  那么通过以上简单介绍,大家应该对数据传输的有了个简单初步认识。我们都知道每台接入互联网的计算机都只有唯一的IP域名,我们使用的所有网络程序,比如QQ,LOL等,要进行数据的交流,必须要与相同的域名进行连接,那么这么多进程怎么才能区分这个网络信息是给我自己的进程的呢?所以每个进程都要绑定端口号,通过IP+端口可以唯一确定信息交流的准确性。socket完成的就是这个任务,每个网络程序调用自身的socket来监听端口,完成信息交流传输,而且信息的交流还要依赖于TCP/IP协议。那么我们再深入了解一下TCP/IP协议,有助于我们深入了解数据间的传输。

  1.客户端和服务端的交流,首先依赖于套接字(也是socket,英文翻译是插座,比较形象,类似于电器和电站之间的连接形式),可以理解为一条管道,所以我们的计算机可能有很多管道同时在工作,管道的终点就是服务端创建的套接字,首先客户端先创建一个套接字,会返回一个描述符,描述符的作用是客户端判断进行交流的网络信息应该走哪条管道,但是这个描述符只有计算机自己知道,服务端并不知道,所以它不能代替端口,作用可以理解为建立好这个端口。

  2.管道建立好之后,就是数据的传输,网络中的数据,并不是源源不断连续的,而是以一个个包的形式来传递,正式因为传递和处理速度之快,你感觉不到他的断断续续。遵循TCP形式的包的统一格式是这样的

简述一下作用:

  报头:一串0101……规则序列。服务端读取时,知道是一个稳定的数据包,他的信息马上要来了。

  起始帧分界符:尾数为11。服务端以此作为数据包的起点。

  FCS:它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的,受到干扰时值会改变,一旦接收方计算的和发送方不一样时就说明此包失真。

  MAC头部 :包含了发送方和接收方的MAC地址,MAC地址位于计算机网卡的ROM中,全世界独一无二,跟指纹一样。

  IP头部:包含了发送方和接收方的IP信息。

  TCP头部:除了发送方端口号,接收方端口号之外,还有如下重要字段:

    序号,ACK号:这两者作用是确保包没有遗漏,如有,会自动补发。

    控制位:1.ACK:(与上方ACK不同)告知数据已接收。

        2.SYN:发送方和接收方互相确认的信号,表示已连接。

        3.FYN:表示断开连接。

有了以上概念,我们来看一下TCP三次握手:(seq表示序号)

第一次握手:客户端SYN=1请求连接,序号=J(标记值,无实际意义,用来确定发送了多少信息),

第二次握手:服务端SYN=1请求连接,ACK=1(已经接收到客户端的连接请求),ack=J+1(已收到你发的J单位信息,请确认你没有漏发),seq=K(标记值无意义,用来确定收到了多少单位信息)

第三次握手:客户端ACK=1(已经接收到服务端的连接请求),ACK=K+1(收到了你发的K大小单位信息,请确认你没有漏发)

TCP四次挥手:

第一次挥手:客户端FIN = M请求断开

第二次挥手:服务端ack=M+1(已收到M单位大小信息,请确认你没有漏发)

第二次挥手:服务端FIN = N请求断开

第四次挥手:客户端ACK=1(确认断开) ack=N+1(已经收到你的N单位信息,请确认你没有漏发)

总结:socket是网络传输必要的标识符,它的作用是建立一个发送方接收方之间的管道,通过socket库中的一些命令recv ,send等来完成收发信息的操作。是TCP传输协议的必要条件之一。相信你已经对文章开头:socket是在传输层和应用层中间的一个抽象层,是实现网络通信的接口。有了更加充分的认识吧。

http中的socket是怎么一回事的更多相关文章

  1. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  2. EBS中利用Socket与外系统通信

    某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...

  3. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

  4. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  5. 34、Android中基于Socket的网络通信(一)

    Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服 ...

  6. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  7. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  8. 读懂Java中的Socket编程(转)

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  9. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

随机推荐

  1. poj 1321 棋盘问题 (DFS深度优先搜索)

    Problem Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋 ...

  2. 解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题

    今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告 ...

  3. (void) (&_min1 == &_min2);【转】

    本文转载自:https://blog.csdn.net/xiaofeng_yan/article/details/5248693 偶然在<./linux/include/linux/kernel ...

  4. Jenkins学习

    1.jenkins启动卡在密码初始化处不动的情况,参照: https://blog.csdn.net/lylload/article/details/82754101 https://blog.csd ...

  5. 使用Java SDK实现离线签名

    严格来说,tx-signer并不属于SDK,它是bytomd中构建交易.对交易签名两大模块的java实现版.因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥. 如果你的 ...

  6. Microsoft.AspNet.Web.Optimization.Bundle的完美替换方案

    Web应用程序中包含大量的样式(css)和脚本(js)文件,这些文件的引用.管理和发布有很多解决方案.在Asp.Net MVC应用程序中,大家最熟悉的解决方案应属Microsoft.AspNet.We ...

  7. ATS 相关

    启动命令 /usr/local/CCTS/bin/trafficserver   start |stop | restart 清盘 /usr/local/CCTS/bin/traffic_server ...

  8. gradle project sync failed.please fix your project and try again-Android Studio3.1.2运行出错

    原因: 修改了工程中MainActivity.java和app文件夹下的代码后运行不了. 解决办法: 关闭Android Studio,然后再重新启动,它会再次构建gradle.

  9. webdriver API

    切换iframe 1.iframe有id和name driver.switch_to_frame(loc) 2.iframe无id和name 先用xpath定位找到iframe.再switch ifr ...

  10. R语言常用函数:交集intersect、并集union、找不同setdiff、判断相同setequal

    在R语言进行数据分析时,经常需要找不同组间的相同和不同,那你应该掌握如下几个函数,让你事半功倍. 交集intersect两个向量的交集,集合可以是数字.字符串等 # 两个数值向量取交集intersec ...