您好、欢迎来到现金彩票网!
当前位置:ds视讯 > 服务原语 >

Socket通讯及底层TCPIP连接原语

发布时间:2019-08-28 23:50 来源:未知 编辑:admin

  互连网技术屏蔽了底层网络硬件细节,使得异种网络之间可以互相通信。TCP/IP协议组是目前使用最广泛的网络互连协议。由于对网络的兴趣,下面一点通讯的资料与大家分享。

  Socket提供了一个通信端口,应用程序在网络上传输/接收的信息都通过这个Socket接口来实现的。在应用开发中可以像使用文件句柄一样来对Socket句柄进行读/写操作。Windows Sockets与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,实现了底层网络通讯对应用程序的透明。在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式。

  传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。

  应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。

  注意:当调用bind()的时候,不要把端口数设置的过小!小于1024 的所有端口都是保留下来作为系统使用端口的,没有root 权利无法使用。可以使用1024 以上的任何端口,一直到65535 :所可能使用的最大的端口号(当然,还要保证你所希望

  是想连接到一个远程主机上面进行通讯,并不在乎你究竟是用的自己机器上的哪个端口

  网络通信中通信的两个进程分别在不同的机器上。在互连网络中,两台机器可能位于不同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址:

  通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP和UDP均使用16位端口号标识用户进程。

  在客户/服务器模式中,有两种类型的服务:重复服务和并发服务。accept()调用为实现并发服务提供了极大方便,因为它要返回一个新的套接字号,其典型结构为:

  if ((initsockid = socket(....)) 0)

  newsockid = accept(initsockid, ...)               /*

  if (fork() == 0){                    /*

  closesocket(newsockid);                                    /*

  这段程序执行的结果是newsockid与客户的套接字建立相关,子进程启动后,关闭继承下来的主服务器的initsockid,并利用新的newsockid与客户通信。主服务器的initsockid可继续等待新的客户连接请求。由于在Unix等抢先多任务系统中,在系统调度下,多个进程可以同时进行。因此,使用并发服务器可以使服务器进程在同一时间可以有多个子进程和不同的客户程序连接、通信。在客户程序看来,服务器可以同时并发地处理多个客户的请求,这就是并发服务器名称的来由

  if ((initsockid = socket(....))0)

  newsockid = accept(initsockid, ...)     /*

  do(newsockid);                               /*

  重复服务器在一个时间只能和一个客户程序建立连接,它对多个客户程序的处理是采用循环的方式重复进行,因此叫重复服务器。并发服务器和重复服务器各有利弊:并发服务器可以改善客户程序的响应速度,但它增加了系统调度的开销;重复服务器正好与其相反,因此用户在决定是使用并发服务器还是重复服务器时,要根据应用的实际情况来定。

  不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低价先存),有的存高位字节(高价先存)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。

  htons()——“Host to Network Short” 主机字节顺序转换为网络字节顺序(对无符号

  htonl()——“Host to Network Long”主机字节顺序转换为网络字节顺序(对无符

  ntohs()——“Network to Host Short “网络字节顺序转换为主机字节顺序(对无符

  ntohl()——“Network to Host Long “网络字节顺序转换为主机字节顺序(对无符

  在把数据发送到Internet 之前,一定要把它的字节顺序从主机字节顺序转换到网络字节顺序!

  注:在struct sockaddr_in 中的sin_addr 和sin_port 他们的字节顺序都是网络字节顺序,而

  这个是因为sin_addr 和sin_port 是从IP 和UDP 协议层取出来的数据,而在IP 和UDP

  协议层,是直接和网络相关的,所以,它们必须使用网络字节顺序。然而, sin_family 域

  只是内核用来判断struct sockaddr_in 是存储的什么类型的数据,并且 sin_family 永远也

  阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.

  非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。

  你有数个同学来访 --- 有若干数据需要收取 ,你时不时的去门口看看,没有看到你同学的话就回客厅等待,看到同学就接到客厅来 --- 非阻塞模式,无论收到数据与否都返回 你一直在门口等着你同学,接到后才回客厅 --- 阻塞模式,接收到数据后才返回。

  从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。为应用进程之间提供端到端的逻辑通信。传输层还要对收到的报文进行差错检测。传输层需要有两种不同的运输协议,即面向连接的TCP 和无连接的UDP。

  ↑————————————(提供进程之间的逻辑通信)———————————↑

  在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中, SYN表示建立连接;FIN表示关闭连接;ACK表示响应;PSH表示有DATA数据传输;RST表示连接重置。

  ———ACK, SEQ = x + 1, ACK = y + 1——→

  A的TCP向B发出连接请求报文段,其首部中的同步比特SYN应置为1,并选择序号x,表明传送数据时的第一个数据字节的序号是x。B的TCP收到连接请求报文段后,如同意则发回确认。B在确认报文段中应将SYN置为1,其确认号应为x+1,同时也为自己选择序号y。A收到此报文段后,向B给出确认,其确认号应为y+1。A的TCP通知上层应用进程,连接已经建立。当运行服务器进程的主机B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立。

  SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

  FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

  TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

  客户执行一个主动TCP打开操作,发送SYN,转到SYN_SENT状态。

  当客户收到SYN+ACK后,向服务器发送ACK,转到ESTABLISHED状态。

  注:1) 如果客户发送到服务器的ACK(第三次握手)丢失,因为客户已经处于ESTABLISHED状态,连接仍能正常工作,所以客户应用进程可以向服务器开始发送数据。

  超时重传机制没有在状态转移图中显示。大多数状态向另一方发送数据的同时也调用超时机制。如果没有出现期望的响应,则重发该数据。若数次重发仍没有得到期望的响应,TCP则放弃重传并回到CLOSED状态。

  各方的应用进程必须独立地关闭自己一方的连接。若一方关闭,该方不再发送数据,但仍能接收发来的数据。任何一方从ESTABLISHED状态转到CLOSED状态都有三种转换组合:

  ESTABLISHED - FIN_WAIT_1 - FIN_WAIT_2 - TIME_WAIT - CLOSED

  ESTABLISHED - CLOSE_WAIT -LIST_ACK - CLOSED

  ESTABLISHED - FIN_WAIT_1 - CLOSING - TIME_WAIT - CLOSED

  TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。

  上面的概念容易理解,我们这里说一下快重传。快重传算法规定,发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时。不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

  揭秘socket     什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址、源端口、目的ip地址和源端口。但是socket在那个位置呢,在TCP/IP网络的四层体系...博文来自:jiaomingliang的专栏

  一句话总结:设置非阻塞,用select等待一段时间看是否连接成功,连接成功再设回阻塞模式。注意select第一个参数一定要加1,否则描述符刚好不在集合当中,会出现超时返回0不可读不可写但send、re...博文来自:Simon的博客

  TCP网络通信TCP编程模型 TCP/IP协议族TCP/IP实际上一个协同工作的通信家族,为网络数据通信提供通路。为讨论方便可TCP/IP协议组大体上分为三部分:1、Internet协议(IP)2、传...博文来自:fighting_kangle的博客

  TCP/IP协议栈这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25...博文来自:MuseIn的专栏

  *Socket通信原理图解*A:Socket(中文翻译为:电源插座)套接字概述*网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识套接字*通信的两端都有Socket(两端都是电源插...博文来自:beyond谚语的博客

  在学习zigbee的过程中一直有个困惑,关于层与层之间的通信,看了很多资料,都是通过原语通信来实现。尤其是在组网的过程中,原语通信用的非常多。  在事件捕获中,比如我上一篇所提及到的按键事件,其中...博文来自:u013243314的专栏

  说明:本文章的传输原语是Linux下的套接字风格,Window下也有自己的套接字风格的API,称为“winsock”,本文章涉及图1:基本的通信模型网络服务器端通信模型理解:一个酒店(服务器),酒店门...博文来自:波波鱼的博客

  服务”在形式上是用一组原语来描述的,这些原语供用户实体访问该服务或向用户实体报某事件的发生。服务原语可以划分为如表1-3所示的4类。服务原语原语意义请求(Request)用户实体要求服务做某项工作指示...博文来自:ventry的专栏

  一句话总结:个人理解成原子语句,不可分割,要么不执行,要么全部执行。摘自百度百科:原语通常由若干条指令组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统的核心,...博文来自:Simon的博客

  以下TCP原语,中,哪一个是属于客户端的:bindlistenconnectacceptconnect用于向服务端发出连接请求,属于客户端。bind用于将套接字与服务器的网络地址联系在一起,liste...博文来自:丿灬安之若死

  TCP一、TCP数据包格式首部格式:建立和关闭连接时,SYN和FIN需要占一个序列号...博文来自:踏雪无痕

  基于TCP/IP UDP Socket通讯的函数库,包括客户端及服务端的链接控制,多线程机制,通讯包的格式可以由用户自由设定。非阻塞式和阻塞式收发数据。接受发送数据保存在一定的队列中,起到缓存机制。

  android的server、client与PC的server、client相互通信的源码

  基于socket应用的TCP/Ip通讯。包含一个服务端,一个客户端。实现客户端与服务端通讯。

  TCP/Ip通讯源代码,可参照该代码,做局域网通讯的vb完整通讯,有一定的借鉴作用

  我想在小区宽带上通过Socket通讯,选用TCP/IP通讯协议,这种保持联接的方式在小区宽带环境中是否会存在掉线问题?rnrn论坛

  一、实验目的1.熟练掌握socket编程命令。2.为下一步实验打好基础。二、实验原理1.网络编程就是通过计算机网络与其他程序进行通信的程序,Socket编程是网络编程的主流工具。2.Socket AP...博文来自:DC的陋室

  从一个驱动的代码中看到了request/indication/response/confirm等函数,不知是什么功能,上网找了找才发现原来是《计算机网络》中有关服务原语的概念。摘抄如下:服务原语包含四...博文来自:Hansel的专栏

  原语内核或微核提供核外调用的过程或函数称为原语(primitive)。原语是一段用机器指令编写的完成特定功能的程序,在执行过程中不允许中断。BaiDu解析Introduction操作系统用语范畴。...博文来自:H002399的专栏

  转载请注明出处:  底层数据结构  如果不理解套接字的具体实现所关联的数据结构和底层协议的工作细节,就很难抓住网络编程的精妙之处,对于TCP套接字来说,更是如此。套接字所关联的底层的数据结构集包含了特...博文来自:兰亭风雨的专栏

  通信网知识梳理一、相关概念无源器件:指工作时不需要外部能量源的器件,电容电阻等有源器件:指工作时需要外部能量源的器件,该器件有个输出,并且是输入信号的一个函数,LED、比较器等高频通信的好处:1 无线...博文来自:一个曾经的程序员的专栏

  我想用c++ builder做一个SOCKET的server程序,是不是用TServerSocket控件,与Client端建立连接后怎样启动一个线程来处理Client端的请求?rn另外,用TClientSocket控件做的Client端又该如何发送接收数据呢?rn我没做过SOCKET通讯方面的编程,见笑了!论坛

  网络编程分两种,一种是TCP编程,另一种是UDP编程(点击打开链接)。而本文先讲述简单的TCP编程,Socket套接字连接通讯,实现简单的客户端与服务器之间的信息传输。下面是客户端与服务器之间简单的数...博文来自:u012432475的专栏

  用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议HTTP(HyperTextTransferProtocol)负责完成的。HTTP是一个...博文来自:那些年....的专栏

  accept函数由TCP服务器调用,用于从已完成连接队列返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠(假定套接字默为默认的阻塞方式)函数原型:ACCEPT(2)LinuxProgr...博文来自:daiyudong2020的博客

  XMPP可扩展通信协议。XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信...博文来自:的博客

  Socket的TCP、UDP通讯(实现功能:文字发送,窗口震动,大文件传输,语音发送,语音通话、直接发送全屏截图)

  自己闲暇时候写的socket多线程通讯模型,代码虽然比较简单,但是比较容易扩展,麻雀虽小,五脏俱全。

  包括C\C#\MATLAB程序编写的与肌电仪通讯的demo,可以用来学习客户端与服务器通讯

  原语通常由若干条指令组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统的核心,它不是由进程而是由一组程序模块所组成,是操作系统的一个组成部分,它必须在管态(一种...博文来自:m243723424的专栏

  1,三次握手建立连接初始状态:服务器调用LISTEN原语。由CLOSED状态进入被动等待连接请求状态。     第一次握手:此时客户执行一个CONNECT原语,同时指定一下参数,我要连接的IP...博文来自:hero_zouzongling的专栏

  在接触Java之前,本人曾对即时通讯工具非常感兴趣。现在是网络时代,网络间通讯已经成为了每个人生活的一部分,有鉴于此,程序员在这方面做出一定的了解是极为必要的。因为工作的关系,一直接触不到网络编程这一...博文来自:Eric_ley的博客

http://wendevick.net/fuwuyuanyu/903.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有