TCP IP Socket In C, 2e-chapter 1 Introduction

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

TCP IP Socket In C, 2e-chapter 1 Introduction

BasilGuo   2020-03-23 我要评论
本章是基础概念,建议补计算机网络基础,这里不全.
[TOC] # 1 网络,数据包,协议 **计算机网络**是多台主机和路由器通过通信信道(communication channels)连接起来的。有三个实体: - 主机,运行程序 - 路由器,转发数据 - 通信信道可以是无线的也可以是有线的 **数据包**就是主机之间传递的信息,是字节序列,由程序构建和解释。数据包不仅有数据,还有包头包含一些转发所用的控制信息。 **协议**是数据包交换时程序的一些约定,主要是解析数据包的控制包头信息。协议是分层的,常见的也是事实标准是TCP/IP。 应用程序、协议和Socket API三者关系如下图,注意Socket的位置。 ![A TCP/IP network](https://img-blog.csdnimg.cn/20200322223803247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhc2lsMTcyOA==,size_16,color_FFFFFF,t_70) 网络层,IP协议提供的是数据报服务(datagram service),使用了分组交换,每一个packet单独处理、发送。但是请注意,IP是一个best-effort协议,尽力而为的host-to-host服务,可能出现包丢失、包乱序、包重复的现象,这需要上层协议来解决。 传输层,有两种协议,可靠有连接字节流的TCP和不可靠无连接数据报的UDP。两者共同点是都使用了端口号(port number)来定位主机上的应用程序,提供的是end-to-end服务。TCP需要三次握手、四次挥手,使用TCP某种情形有点像文件I/O。但是使用UDP的应用程序需要自己来处理IP的三个问题。 # 2 关于地址(address) 通信之前必须知道对方的地址,就像邮局送信一样,知道了地址才能投递出去。确定网络中某个应用程序的位置,需要三个信息:IP地址、端口号和传输协议。 IP地址有两种:IPv4和IPv6。 ## 2.1 IP地址格式 IPv4使用32位(bit)地址,常见写法是点分十进制。如```10.1.2.3```。IPv6是128位地址,通常使用32个16进制数(hex)来表示,如```2000:fdb8:0000:0000:0001:00ab:853c:39a1```,中间的0可以省略,但是只能省略一次,如果多个地方省略了0,就无法判断到底是省略了几个0,上述地址等价于```2000:fdb8::1:ab:853c:39a1```。 ## 2.2 IPv4和IPv6共存 现在处于IPv4向IPv6的过渡时期,但是怪异的是,IPv6和IPv4不兼容,常见的过渡手段:双栈、隧道和翻译【这是我知道的补充知识】。双栈就是IPv4和IPv6两个协议栈共存。这是最简单的方法,但是IPv4和IPv6没法通信,各走各的路罢了。隧道得名于英吉利海峡的海底隧道,就是把汽车放在火车上过海底隧道,这里是IPv6-in-IPv4或者IPv4-in-IPv6。翻译是清华大学李星老师力推的。还有IPv4映射到IPv6,使用```::fff:IPv4 address```,这种写法很怪异,前面是hex,后面IPv4地址是点分十进制。 ## 2.3 端口号 TCP和UDP都有端口号,端口号是确定主机上的应用程序的。端口号是16位无符号二进制数,共有65536个端口号,其中0是保留端口号,0~1023是系统端口(System Port),端口号从1024---49151是被注册的端口,也称为用户端口(User Port),后面49152~65536是动态分配的[^1],具体的分配用途参加RFC6335。 ## 2.4 特殊地址 - 本地回环地址(Loopback Address),分配给虚拟设备,回环接口,发出去的数据会再发给本机,用于测试IP协议安装正确性,即便没有网卡也可以使用。IPv4是```127.0.0.1```,IPv6是```0:0:0:0:0:0:0:1```,或简写```::1```。 - IPv4的私有地址(Private Address),```10.0.0.0/8```,```172.16.0.0/12```,```192.168.0.0/16```。对于NAT地址转换未尝不是一件好事。 - 链路本地地址(Link-local Address),也称自动配置(autoconfigration)地址。 它仅供于在网段,或广播域中的主机相互通信使用,路由器也不会转发这类地址。这类主机通常不需要外部互联网服务,仅有主机间相互通讯的需求。IPv4是```169.254.0.0/16```,IPv6是```FE80::/10```开头的地址。 - 多播(组播)地址(Multicast Address)。IPv4是```224.0.0.0/24```,IPv6是```FF00::/120``` # 3 关于名字(Name) 网络协议处理的是地址,而非名字。地址是二进制数,而名字是字符串,显然使用名字更方便(基于这个原因出来了NDN网络吗[smile cry])。从名字到地址的转换使用了DNS(Domain Name System,域名系统)。 # 4 C/S架构 客户端程序发起通信请求,服务端程序被动(passively)等待并响应请求。【其实就是请求响应模型了】客户端需要知道服务器端的IP地址和端口号才能发起请求,而服务器端收到请求也便知道了客户端的IP地址和端口号。 IP地址一般是通过统一资源定位符(Universal Resource Locator,URL)并结合名字服务知道的。端口号则是由IANA(Internet Assigned Number Authority)分配的[^1]。 还有一种架构是peer-to-peer(P2P),【B/S是C/S的一种】,但是这种架构按我理解其实也是一种极端的C/S,一个peer既是server,也是client。 # 5 什么是Socket Socket其实最早叫做Berkeley Socket出现于Unix系统上,简称Socket,是应用程序收发数据的一种抽象手段,和打开文件操作,允许程序读写一样,毕竟Unix哲学:“一切都是文件”嘛。Socket也是一种文件。 不同的协议栈有不同的Socket,这里只关注TCP/IP协议栈。这里的Socket分为Stream Socket,以及Datagram Socket。前者使用TCP,后者使用UDP。 ![Sockets,protocols,and ports](https://img-blog.csdnimg.cn/20200323001313931.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhc2lsMTcyOA==,size_16,color_FFFFFF,t_70) 上图描述了应用程序、Socket、协议、端口号以及主机之间的逻辑关系。 # 参考 [^1]: [Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们