1.TCP/IP协议

TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议,ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。

TCP/IP协议是一个四层协议,结构如图:

每一层负责的功能如下:

链路层:也被称之为数据链路层或网络接口层,通常包括OS中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆(或其他任何传输媒体)的物理接口细节。该层包括的协议有:ARP(Address Resolution Protocol, 地址转换协议) 和 RAPP(Reverse Address Resolution Protocol,反向地址转换协议)。

网络层:也称为互联网层,负责报文分组在网络中的活动,包括IP协议(网际协议)和ICMP(Internet 互联网控制报文协议)以及IGMP(Internet 组管理协议)。

传输层:该层主要为两台主机上的应用程序提供端到端的数据通信,它分为两个不同的协议:TCP(Transport Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。TCP协议提供端到端的质量得到保证的数据传输,该层负责数据的分组,质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。UDP协议则只提供简单的把数据报从一端发送到另一端,至于数据是否到达或按时到达以及数据是否损坏等都必须由应用层来做。这两种协议各有各的用途。前者可用于面向连接的应用,后者在及时性服务中有着重要的用途,如网络多媒体通信等。

应用层:该层负责处理实际的应用程序细节,包括Telnet(远程登录),HTTP(World Wide Web 服务)、 SMTP(Simple Mail Transfer Protocol, 简单邮件传输协议),FTP(File Tradfer Protocol, 简单文件传输协议)和SNMP(Simple Network Management Protocol, 简单网络管理协议)等协议。

IP协议

IP层接收由更底层(网络接口层,如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层。相反,IP层也把从TCP或UDP层接收来的数据包传送到更底层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。

传输控制协议(TCP)是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与IP协议相结合,TCP组成了因特网协议的核心。大多数网络应用程序都在不同的机器上运行,计算机必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用TCP的"端口号"完成的。网络IP地址和端口号结合成为唯一的标识,称之为“套接字”或“端点”。TCP在端点间建立连接或虚拟电路进行可靠通信。TCP服务提供了数据流传输,可靠性、有效流控制,全双工操作和多路复用技术等。TCP通过面向连接的,端到端的可靠数据报发送来保证可靠性。TCP的可靠机制充许设备处理丢失、延时、重复及读错的包。超时机制充许设备监测丢失包并请求重发。

用户数据报协议(UDP)是一种无连接的传输层协议,提供面向操作的简单不可靠信息传递服务。UDP协议直接工作于IP协议的顶层,UDP协议端口不同于多路应用程序,其运行是从一个单个设备到另一个单个设备。

2.套接字编程

windows Sockets是Windows OS下定义的二进制兼容的网络编程接口,用途是将网络抽象出来,使用户不需要了解网络的细节,并且可以和任何支持套接字的程序进行网络通信。套接字是一个通信的终端,它是应用程序在网络中发送或接收数据包的对象,这个对象有类型、名字可以和进程关联。套接字是通信的基石,是支持TCP/IP协议网络通信的基本操作单元。

可用的套接字类型有以下两种:

流式套接字(SOCK_STREAM)

流式套接字定义了一种面向连接、可靠的数据传输服务,数据无差错,无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。字节流能确保以正确的顺序无重复的被送达。

数据报套接字(SOCK_DGRAM)

数据报套接字定义了一种无连接服务。数据报以独立包形式被发送,不提供无措保证,数据可能丢失或重复,并且接收顺序混乱。

windows Sockets是一组可供应用程序进行TCP/IP通信的API应用编程接口,是一组编写网络应用程序的基本API函数,如创建套接字,地址绑定,侦听连接请求,发出连接请求,接受连接请求,发送和接收数据和关闭套接字等。这些winsock2 所用API函数的声明、常数等均在winsock2.h内定义。windows sockets2所用的API函数代码的实体包含在动态链接库ws2_32.dll中,winsock2网络应用程序.exe运行时,在动态加载系统目录中的动态链接库ws2_32.dll中,即可调用这些动态进驻到内存的winsock2 API函数代码实体。为了能这样做,网络应用程序.exe中需要ws2_32.dll的符号信息及相应的符号表,这些信息应在网络应用程序时,应在"Project"中选择"Settings…",然后在弹出对话框的"Link"选项卡中的"Object/library Modules"中添加静态链接函数库 ws2_32.lib, 才能成功编译运行,或者在代码中使用: #pragma comment(lib, "ws2_32.lib").

windows套接字程序执行API函数I/O操作时有阻塞和非阻塞两种模式。在阻塞模型下,执行I/O操作的winsock函数(如accept/ send/recv等函数)在I/O操作完成前,会一直等下去,不会立即返回程序(将控制权交还给程序);而在非阻塞模型下,调用winsock函数进行I/O操作时,不管I/O有没有完成会立即返回。Socket在初始化后默认工作在阻塞模型,可以通过ioctlsocket()函数改变Socket工作模型。通常,网络应用程序在阻塞模型下使用winsock2的API库函数进行流式套接字和数据报套接字两种编程方式。下面介绍这两种编程方式:

1.无连接的通信

Socket通信分为面向连接的通信(TCP)和面向无连接的通信(UDP)。其中无连接服务器一般都是面向事务处理的,一个请求和一个应答就完成了客户程序与服务程序之间的相互作用。

数据报套接字是无连接的,它的编程过程比流式套接字模型要简单。数据报套接字编程模式使用的基本winsock函数与流式套接字模型使用的函数是一样的,而数据传输函数则和流式套接字不同,发送数据用sendto函数,接收数据用recvfrom函数。

数据报套接字通信分为如下三步:

1.服务器端和客户端都要创建一个数据报套接字

2.服务器端调用bind函数给套接字分配一个公认的端口,在开放应用程序时,这个公认端口通常是指定的。客户端同样也需要对套接字进行绑定。

3.客户端和服务器端都可以使用sendto函数发送数据,使用recvfrom函数接受数据,完成数据报传递。通信结束时调用closesocket函数关闭套接字。默认情况下,recvfrom函数处于阻塞模型,在接收到数据前,程序将不向下执行。具体如图:

2.面向连接的通信

流式套接字又称为会话套接字,它定义了一种可靠的面向连接的服务,实现无差错无重复的顺序数据传输。流式套接字的服务进程和客户进程在通信前必须建立各自的套接字并进行连接,然后才能对相应的套接字进行"读",“写”操作,实现数据的传输。

流式套接字通信主要分布四步:

1.要将指定协议的套接字绑定到它已知的名字上,这个名字就是本地的IP地址加端口号。这个过程通过bind函数来完成。

2.服务进程要处于侦听状态,等待任意数量的客户端连接,以便为它们的请求提供服务。服务进程必须在所绑定的名字上进行侦听。因此,需要把套接字置为侦听模式,通过listen函数来完成。

3.服务进程调用函数accept或WSAAccept准备接受来自客户端的连接。如果一个客户端这时用函数connect试图建立连接,服务进程就可以接受连接。

4.连接建立之后,服务器端和客户端之间就可以使用函数send和recv进行通信。需要说明的是,默认情况下函数recv处于阻塞模型,在接受到数据前,程序将不向下执行。具体流程如下:

C项目实践--网络协议和套接字编程的更多相关文章

  1. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  2. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  3. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  4. 基于UDP协议的套接字编程

    基于udp协议的套接字编程 UDP是无链接的,先启动那一端都不会报错 UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到 一般不用与传输大数据 虽然没有粘包问题,但是不能 ...

  5. 网络编程[第一篇]基于tcp协议的套接字编程

    将服务端-客户端的连接比作双方打电话的过程 2019-07-24 一.客户端 主动的一方: 客户端实例化一个socket对象--> 主动像服务端发送连接请求--> (服务端接受请求后即可进 ...

  6. 基于TCP协议的套接字编程

    06.26自我总结 1.关于Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在 ...

  7. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  8. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  9. 4-socket套接字编程

    socket套接字编程 目标:根据socket模块提供的接口函数,进行组合使用完成基于tcp或者udp的网络编程. 套接字:完成上述目标的一种编程手段,编程方案. 套接字分类: 流式套接字(sock_ ...

随机推荐

  1. Python 模块学习(一)

    一.时间模块 import time # 模块调用语句 注意:模块级导入一般放在文件顶部 import datetime print(time.time()) # 1550411181.441547: ...

  2. 3. express 框架使用 vue框架 weiUI

    express 1. 安装 npm install express --save 2. 创建项目 vue js 安装Vuejs vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue- ...

  3. JSP指令学习

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言.语法格式: <%@ page attribute="value"%> 指令可以有很 ...

  4. HDU 1874 最直接的最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  5. iOS - 设置系统类似的方法弃用警告的方式

    在开发过程中,调用系统方法时,经常可以看xCode 提示 该方法已弃用,如下图: 觉得特别炫,查一下资料,如果自己也想实现如下的效果,只需要采用系统的如下几个关键字加在方法名后面就可以了: NS_DE ...

  6. POJ 2135 最小费用最大流 入门题

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7441 Descri ...

  7. csu - 1659 Graph Center(最短路)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1659 题意是找一个图的中心,图的中心定义是某一个点到其他点的最大距离最小,如果有多个排序输出. 注 ...

  8. Python数据分析常用的库总结

    Python之所以能够成为数据分析与挖掘领域的最佳语言,是有其独特的优势的.因为他有很多这个领域相关的库可以用,而且很好用,比如Numpy.SciPy.Matploglib.Pandas.Scikit ...

  9. React学习及实例开发(三)——用react-router跳转页面

    本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.定义路由 1.安装react-router npm install react-router@ --sav ...

  10. 洛谷——P2916 [USACO08NOV]为母牛欢呼Cheering up the Cows

    https://www.luogu.org/problem/show?pid=2916 题目描述 Farmer John has grown so lazy that he no longer wan ...