任何事物的创造发明都来源于需求和欲望

在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等。对于这些接口的底层实现我们也有必要进一步的了解,这就要我们了解网络通信层了,提到网络通信层不得不说起ISO-OSI的七层协议经典架构,如图所示:

在了解socket网络编程之前,我们需要先知道以下几个问题:

而科学技术的发展则推动实现了目标

图片 1

  • 网络中进程之间如何通信?
  • Socket是什么?
  • TCP和UDP的区别?
  • socket中TCP的三次握手和四次握手建立连接详解
  • iOS socket的基本操作

互联网发展的编年体记录

百度百科:

https://baike.baidu.com/item/%E4%BA%92%E8%81%94%E7%BD%91%E5%8F%91%E5%B1%95%E5%8F%B2/4635625

“阿帕”(ARPA),是美国高级研究计划署(Advanced
Research Project Agency)的简称。

阿帕网为美国国防部高级研究计划署开发的世界上第一个运营的封包交换网络

它是全球互联网的始祖。

上图的左边部分就是osi架构模型了,
ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection
Reference
Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。图最右边则是TCP/IP协议模型了,TCP/IP协议模型(Transmission
Control Protocol/Internet
Protocol),包含了一系列构成互联网基础的网络协议(对应上图的中间部分),是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。所以平常我们所提起的tcp/ip协议它并不是指一个具体的协议而是一个网络传输协议集合模型的统称。对应于标准的osi模型它制定了自己的四层协议系统,每一层都包含了多个不同的通信协议。

一、网络中进程之间如何通信?

背景

从某种意义上,Internet经常被认为是美苏冷战的产物。

在美国,20世纪60年代是一个很特殊的时代。

60年代初,古巴核导弹危机发生,美国和原苏联之间的冷战状态随之升温,核毁灭的威胁成了人们日常生活的话题。

在美国对古巴封锁的同时,越南战争爆发,许多第三世界国家发生政治危机。

由于美国联邦经费的刺激和公众恐惧心理的影响,”实验室冷战”也开始了。

人们认为,能否保持科学技术上的领先地位,将决定战争的胜负。

而科学技术的进步依赖于电脑领域的发展。

到了60年代末,每一个主要的联邦基金研究中心,

包括纯商业性组织、大学,都有了由美国新兴电脑工业提供的最新技术装备的电脑设备。

电脑中心互联以共享数据的思想得到了迅速发展。

观点

美国国防部认为,

如果仅有一个集中的军事指挥中心,万一这个中心被原苏联的核武器摧毁,

全国的军事指挥将处于瘫痪状态,其后果将不堪设想,

因此有必要设计这样一个分散的指挥系统——

它由一个个分散的指挥点组成,当部分指挥点被摧毁后其它点仍能正常工作,而这些分散的点又能通过某种形式的通讯网取得联系

以上来自于百度百科中阿帕网词条的释义

 

可以看得出来,任何东西都是需求和欲望产生的,计算机网络的发展也不例外

她不是为了给人类一个更好的生活,为了让你聊微信刷微博逛淘宝….而是为了战争!

1948年 香农
通信的数学理论中写道:

通信的基本问题是在一点精确地或者近似的复现在另一个点所选取的讯息,这些讯息往往都是有意义的

通信的本质是数据交换,只有实现了数据的交换,才能证明线路的连通性

 

 

那么TCP/IP到底是怎样工作的又为什么需要它呢?在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道网络层的ip地址可以唯一标示主机,而传输层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用三元组(ip地址+协议+端口号)唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了。

通信方式有以下几种:

电路交换(CS:circuit
switching)是通信网中最早出现的一种交换方式,也是应用最普遍的一种交换方式,主要应用于电话通信网中,完成电话交换。

建立连接时产生时延,既实用模拟信号,又适用数字信号。

下面我们就来看下具体的TCP/IP协议系统的分层,如图:

二、Socket 是什么?

独占性/实时性好/可靠性高

由于电路交换的特点,建立连接后,无论是否通话都将占用资源

 

后来出现了报文交换方式

报文交换以报文为数据交换的单位,报文携带有目标地址、源地址等信息,在交换结点采用存储转发的传输方式不需要为通信双方预先建立一条专用的通信线路

由于数据进入交换结点后要经历存储、转发这一过程,从而引起转发时延,只适用数字信号

报文长度没有限制,而每个中间结点都要完整地接收传来的整个报文,对缓冲有较大要求

 

再后来出现了分组交换

1961第一篇有关包交换(PS  Packet
switching)的论文。

1962 MIT的J.C.R. Licklider和W.
Clark发表On-Line Man Computer Communication,(8月)

包交换就是分组交换

分组交换仍采用存储转发传输方式

但将一个长报文先分割为若干个较短的分组,然后把这些分组(携带源、目的地址和编号信息)逐个地发送出去

 

分组交换是现代计算机网络通信的理论基础

随后包交换从理论应用到实践

1965年
ARPA资助进行分时计算机系统的合作网络研究。

随后ARPANET被提上了日程

1968年 开始着手建设ARPANET

它利用了无限分组交换网与卫星通信网。

通过专门的接口信号处理机(IMP)和专门的通信线路,相互连接把美国的几个军事及研究用电脑主机联接起来。

起初是为了便于这些学校之间互相共享资源而开发的。

ARPANET采用了包交换机制。

1968年 Bolt Beranek and
Newman、Inc.公司(BBN)获得建立接口消息处理机(IMP)中的包交换部分的合同。

IMP是一种专用于通信的计算机,有些IMP之间直接相连,有些IMP之间必须经过其他的IMP间接相连。当IMP收到一个报文后要根据报文的目标地址决定把该报文提交给与它相连的主机还是转发到下一个IMP,这种通信方式叫做存储-转发通信。

1969年
使用BBN公司开发的接口消息处理器IMP建立节点(配有12K存储器的Honeywell
DDP-516小型计算机);

AT&T公司提供速率为50kpbs的通信线路。

最初ARPAnet只联结4台主机

从军事要求上是置于美国国防部高级机密的保护之下,从技术上它还不具备向外推广的条件。

在阿帕网(ARPA)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容

在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。

当时美国的状况是

陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑

每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。

69年9月阿帕网诞生、运行后,才发现各个IMP连接的时候,需要考虑用各种电脑都认可的信号来打开通信管道,数据通过后还要关闭通道。

否则这些IMP不会知道什么时候应该接收信号,什么时候该结束,这就是我们所说的通信“协议”的概念。

1970年12月制定出来了最初的通信协议由卡恩开发、瑟夫参与的“网络控制协议”(NCP

 

图片 2

上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open
–> 读写write/read –> 关闭close”模式来操作。

TCP/IP

可以看得出来,计算机网络中的通信协议,自此时开始被摆上台面

“包切换”理论为网络之间的联接方式提供了理论基础。

卡恩  Bob Kahn  https://en.wikipedia.org/wiki/Bob\_Kahn

在自己研究的基础上,认识到只有深入理解各种操作系统的细节才能建立一种对各种操作系统普适的协议

73年卡恩请 瑟夫Vint Cerf https://en.wikipedia.org/wiki/Vint\_Cerf

一起考虑这个协议的各个细节,

他们这次合作的结果产生了在开放系统下的所有网民和网管人员都在使用的“传输控制协议”

(TCP,Transmission-Control
Protocol)和“因特网协议”(IP,Internet Protocol)即TCP/IP协议。

 

TCP/IP参考模型是首先由ARPANET所使用的网络体系结构。

这个体系结构在它的两个主要协议出现以后被称为TCP/IP参考模型(TCP/IP
Reference Model)。

这一网络协议共分为四层:网络接口层、互联网层、传输层和应用层

TCP/IP不是一个协议,而是一个协议族的统称

对于程序员来说,经常说到的网络的发展

其实可以狭义的理解为TCP/IP协议族中各个层次里面各个协议的发展

以及通信中涉及到的各个重点概念  IP地址 
端口号 域名系统 DNS等等

 

当然还有最重要的就是  应用编程接口 
也即是操作系统提供给我们的可以进行网络编程的接口

继续狭隘一点的话,应用编程接口
就成了应用程序员唯一直接接触的东西了

现在说的话就是Socket,几乎所有的应用程序都是采用socket

 

看到上面层次图,如果你之前有了解过,可能会读上面的Socket抽象层表示疑惑,不打紧后面会介绍。我们可以看到TCP/IP层共四层:链路层、网络层、运输层以及应用层,概念上是没有上图中的socket抽象层。

从这张图片中,我们可以很直观的看到Socket的位置。我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

socket到底是什么?

随着操作系统的发展,1983年,TCP/IP被Unix
4.2BSD系统采用.

随着Unix的成功,TCP/IP逐步成为Unix机器的标准网络协议.

所谓的采用也就是用程序代码按照TCP/IP的逻辑实现了两个应用程序相互通信的功能

我们之前解释过操作系统的作用了

既然操作系统有了这个功能,自然会提供出来编程接口

这样应用程序员就不在需要去实现复杂的通信代码了

并不是每一项技术的出现,都是高屋建瓴,Socket也即是如此

TCP/IP很快被集成到Unix中之后,出现了许多成熟的TCP/IP应用程序接口(API)

这个API就是Socket 接口

Socket 起源于Unix 
WINDOWS下也有一套socket规范

Socket是在TCP/IP模型分层的应用层和传输层之间的一个编程接口

也可以理解为对于应用程序员中编写需要通信的程序来说

TCP/IP模型中应用层和传输层又多了一个Socket层

只是逻辑思维的抽象理解,不是真的存在的

 

把复杂的TCP/IP协议族隐藏在Socket接口后面,

对用户来说,这一组接口,就是整个TCP/IP协议族的实现

让Socket去组织数据,以符合指定的协议。

这不就是之前说过的抽象封装规范的概念嘛

 

再次明确下Socket到底是什么:

Socket本质是编程接口(API),对TCP/IP的封装,也可以说是一种通信约定或者方式

两台计算机想要通信需要IP地址,协议,端口号

IP地址是为了实现网络中不同计算机之间的通信给每台计算机设置的唯一的标识

目前计算机所使用的通信协议是TCP/IP协议栈

端口是为了实现计算机中不同程序间的通信,给同一个主机每个不同的应用程序设置的唯一标识

IP地址和端口组合在一起就构成了一个socket

网络通信本质是socket之间的通信

数据在两个socket之间通过IO传输

Socket之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

 

 

 

 

完整内容点击标题进入

 《计算机软硬件发展系列个人理解与总结-导航页》

 

1.计算机发展阶段

2.计算机组成-数字逻辑电路

3.操作系统简单介绍

4.计算机启动过程的简单介绍

5.计算机发展个人理解-电路终究是电路

6.计算机语言的发展

7.计算机网络的发展

8.web的发展

9.java
web的发展

 

(1). 链路层

三、TCP和UDP的区别?

也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。具体的细节可以转到这边文章《Android网络编程系列

TCP/IP协议族之链路层》

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

(2). 网络层

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。

TCP三次握手和四次挥手
相对于SOCKET开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的。因此开发者并不需要控制这个过程。但是对于理解TCP底层运作机制,相当有帮助。

IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

因此在这里详细解释一下这两个过程。

具体的细节可以转到这边文章《Android网络编程系列 一
TCP/IP协议族之网际层》

TCP三次握手

(3). 传输层

所谓三次握手(Three-way
Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换
TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。

三次握手

UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。

首先了解一下几个标志,SYN(synchronous),同步标志,ACK
(Acknowledgement),即确认标志,seq应该是Sequence
Number,序列号的意思,另外还有四次握手的fin,应该是final,表示结束标志。

具体的细节可以转到这边文章《Android网络编程系列 一
TCP/IP协议族之传输层》

第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence
Number)字段里。

(4). 应用层

第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement
Number)设置为客户的序列号加1以,即X+1。

应用层负责处理特定的应用程序细节。

第三次握手:客户端再次发送确认包(ACK)
SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。

(5). socket抽象层

TCP四次挥手

对于上图中显示 socket抽象层 这是一个很重要的
层次,是直接负责应用层和传输层通信的,它的作用就是使得上层(应用层)通信更方便更安全。实则就是对传输层的封装对应用层的接口提供,这里现就不扩展了,下一篇文章将重点介绍 socket抽象层

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way
handshake)。客户端或服务器均可主动发起挥手动作,在socket

编程中,任何一方执行close()操作即可产生挥手操作。

TCP/IP协议系统的每一层在数据传输工作中分工都很明确,我们可以看其数据通信图:

其实有个问题,为什么连接的时候是三次握手,关闭的时候却是四次挥手?

图片 3

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

首先,是最上层的应用层,用户将应用数据通过应用层协议如http、ftp等封装好必要的客户端数据信息传递到下一层(传输层),这时候传输层的tcp或udp协议就会为其携带上客户端端口等信息。封装好了接着传递到网际层,在这里就会为数据携带上客户端的IP等信息。再接着讲数据发送到链路层,这一层为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备同时还为数据携带了目标主机的mac地址(每个以太网卡mac地址都是唯一的)。再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等.

tcpsocket和udpsocket的具体实现

了解了数据发送,接下了看看目标主机对数据的接收过程,如下图:

tcp和udp的socket是有区别的,这里给出这两种的设计框架。

图片 4

基本TCP客户—服务器程序设计基本框架:

上面提到了客户机在传输数据在链路层会为数据携带上目标主机的mac地址,所有就可以根据这个数据携带的IP地址和mac地址在互联网中寻找到当目的主机,接着当目标主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。协议是通过目的端口号、源I
P地址和源端口号进行解包的。

基本UDP客户—服务器程序设计基本框架流程图:

以上呢就是关于TCP/IP协议通信的大致流程了,接下来为了更好的吸收和理解这些知识点,你有必要了解以下基本概念:

常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

ip地址

四、 iOS socket的基本操作

网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)。现在,通常使用的IP地址是一个32bit的数字,也就是我们常说的IPv4标准,这32bit的数字分成四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,我们常用的是B类地址。具体的分类请参考其他文档。需要注意的是IP地址是网络号+主机号的组合,这非常重要。

讲了这么久,终于要开始讲socket的具体实现了,iOS提供了Socket网络编程的接口CFSocket,不过这里使用BSD
Socket。iOS网络编程层次结构也分为三层:

DNS

  • Cocoa层:NSURL,Bonjour,Game Kit,WebKit
  • Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices
  • OS层:基于 C 的 BSD socket

域名系统是一个分布的数据库,它提供将主机名(就是网址啦)转换成IP地址的服务。 DNS
是计算机域名系统 (Domain Name System 或Domain Name Service)
的缩写,它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。

Cocoa层:是最上层的基于 Objective-C 的 API,比如
URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的
API。Cocoa 层是基于 Core Foundation 实现的。

RFC

Core Foundation层:因为直接使用 socket
需要更多的编程工作,所以苹果对 OS 层的 socket
进行简单的封装以简化编程任务。该层提供了 CFNetwork 和
CFNetServices,其中 CFNetwork 又是基于 CFStream 和 CFSocket。

RFC是什么?RFC就是tcp/ip协议的标准文档,在这里我们可以看到RFC那长长的定义列表,现在它一共有4000多个协议的定义,当然,我们所要学习的,也就是那么十几个协议而已。

OS层:最底层的 BSD socket
提供了对网络编程最大程度的控制,但是编程工作也是最多的。因此,苹果建议我们使用
Core Foundation 及以上层的 API 进行编程。

端口号(port)

socket调用库函数主要有:

创建套接字
Socket(af,type,protocol)

建立地址和套接字的联系
bind(sockid, local addr, addrlen)

服务器端侦听客户端的请求
listen( Sockid ,quenlen)

建立服务器/客户端的连接 (面向连接TCP)

客户端请求连接:
Connect(sockid, destaddr, addrlen)

服务器端等待从编号为Sockid的Socket上接收客户连接请求
newsockid=accept(Sockid,Clientaddr, paddrlen)

发送/接收数据

面向连接:
send(sockid, buff, bufflen)       
recv( )

面向无连接:
sendto(sockid,buff,…,addrlen)       
recvfrom( )

释放套接字:
close(sockid)

注意,这个号码是用在TCP,UDP上的一个逻辑号码,用于区别开主机上不同应用程序。服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP
(简单文件传送协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。这些知名端口号由Internet号分配机构(Internet
Assigned Numbers Authority,
IANA)来管理。知名端口号介于1~255之间;256~1023之间的端口号通常都是由Unix系统占用,以提供一些特定的Unix服务;1024~5000端口号用于客户端分配临时端口号;大于5000的端口号是为其他服务器预留的。

socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用编程接口

多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

现在常用的编程接口有socket和TLI。这就是上面所提到socket抽象层。

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

相关文章