首先我们先看一下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. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

  2. windos下安装pgAdmin

    1.进入pgAdmin官方网址 https://www.pgadmin.org/download/ 2.下载安装包 版本下载地址:https://www.pgadmin.org/download/pg ...

  3. JS(JavaScript)的进一步了解6(更新中···)

    元素的属性 div.attributes 是所有标签属性构成的数据集合 div.classList 是所有class名构成的数组集合 在classList的原型链上看以看到add()和remove() ...

  4. Django project troubleshootings

    1. 当django project文件夹放到cgi-bin目录下面时会出现下面的错误: [Wed Jan 09 01:52:52.611690 2019] [core:notice] [pid 15 ...

  5. CocosCreator 小知识

    最近在自学creator,有些小坑和解决方案,想记录下来: 1. 防止点击穿透 场景:在游戏界面有功能按钮,上层弹出layer之后,加入了遮罩,但是游戏界面的功能按钮还可以点击,穿透了! 方案1:遮罩 ...

  6. php LBS(附近地理位置)功能实现的一些思路

    在开发中经常会遇到把数据库已有经纬度的地方进行距离排序然后返回给用户 例如一些外卖app打开会返回附近的商店,这个是怎么做到的呢? 思路一: 根据用户当前的位置,用计算经纬度距离的算法逐一计算比对距离 ...

  7. git1使用步骤初始化拉取修改提交推送

    Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. 在执行完成 git init  ...

  8. leecode第二百三十七题(删除链表中的节点)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  9. windows命令行经ss代理

    set http_proxy=http://127.0.0.1:port set https_proxy=http://127.0.0.1:port ss设置,启用系统代理,pac模式

  10. expect使用

    expect时用与提供自动交互的工具.比如如果想要用ssh登陆服务器,每次都输入密码你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码了. 先看例子: #!/usr/bi ...