本章是基础概念,建议补计算机网络基础,这里不全.

1 网络,数据包,协议

计算机网络是多台主机和路由器通过通信信道(communication channels)连接起来的。有三个实体:

  • 主机,运行程序
  • 路由器,转发数据
  • 通信信道可以是无线的也可以是有线的

数据包就是主机之间传递的信息,是字节序列,由程序构建和解释。数据包不仅有数据,还有包头包含一些转发所用的控制信息。

协议是数据包交换时程序的一些约定,主要是解析数据包的控制包头信息。协议是分层的,常见的也是事实标准是TCP/IP。

应用程序、协议和Socket API三者关系如下图,注意Socket的位置。



网络层,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/8172.16.0.0/12192.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: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。



上图描述了应用程序、Socket、协议、端口号以及主机之间的逻辑关系。

参考


  1. Service Name and Transport Protocol Port Number Registry ↩︎ ↩︎

TCP IP Socket In C, 2e-chapter 1 Introduction的更多相关文章

  1. mysql错误:Can’t create TCP/IP socket (10106) 解决方法

    错误描述 “mysql错误:Can’t create TCP/IP socket (10106)”,目测是socket端口被占用的原因,然后在打开tomcat,报的错误中也包含了“socket”,再一 ...

  2. Linux IPC tcp/ip socket 编程

    模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...

  3. HTTP,TCP/IP,Socket

    HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议. TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据. ...

  4. TCP/IP Socket发送接收图片demo

    一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...

  5. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  6. Android TCP/IP Socket Test

    TCP/IP协议:Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...

  7. TCP/IP Socket 的理解

         网络由下往上分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.      TCP 协议对应于传输层,HTTP 协议对应应用层,Socket 则是对 TCP/IP 协议的封装. ...

  8. 【Java TCP/IP Socket】TCP Socket(含代码)

    TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...

  9. 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservic

    TCP/IP:网络宽带,传输数据的基础协议,所有得数据要在网络上传输都是基于TCP/IP协议(或UDP),才能送达到指定的目的地(IP,服务器硬件地址). SOCKET:SOCKET只是面对编程人员的 ...

  10. http和tcp/ip,socket的区别

    http协议和tcp/ip协议乍看起来,感觉是同一类的东西,其实不然,下面简单的说说他们的区别. http协议是应用层的一种数据封装协议,类似的还有ftp,telnet等等,而tcp/ip是数据传输层 ...

随机推荐

  1. 省A类竞赛二等奖--村先游项目VUE前端重构

    村先游--省二竞赛项目VUE重构 源码地址: 重构前的(前端+后台):https://github.com/Archer-Fang/cunxianyou 重构前的(前端):https://github ...

  2. ibator使用

    一.ibator是一个ibatis的代码生成工具,它能根据数据表自动生成javabean.sqlmap. ibator的官方地址是 http://ibatis.apache.org/ibator.ht ...

  3. 提高你css技能的css开发技巧

    好久没整理博客了 进来啰嗦两句   继续抄别人的博客 一.resize实现图片对比 resize的语法如下: resize:none | both | horizontal | vertical 案例 ...

  4. linux下好用软件全记录

    开发工具 1. Shutter 抓图工具(用过linux最好的抓图工具,类似win下的Snagit) 2. RabbitVCS SVN客户端(可以和subversion媲美的svn客户端) 3. My ...

  5. FBI今年最重要的任务:招募黑客

    ​ 当FBI(联邦调查局)一次又一次被爆出丑闻的时候,面临着一个又一个的尴尬局面.在这样的情况下,FBI发现了自己的一个巨大问题,那就是以前都依靠隐秘行动和人员的保密性来保证国家的安全,现在必须依靠更 ...

  6. 【原创】面试官问我G1回收器怎么知道你是什么时候的垃圾?

    这是why技术的第36篇原创文章 上面的图片是我上周末在家拍的.以后的文章里面我的第一张配图都用自己随手拍下的照片吧.分享生活,分享技术,哈哈. 阳台上的花开了,成都的春天快来了,疫情也应该快要过去了 ...

  7. LLVM 中间代码归纳

    Identifiers 标识符 @ 全局 % 局部 后接字符串 命名量 @name %name 无符号数字 未命名量 @42 %42 类型系统 void 空类型 <type> * 指针类型 ...

  8. 全差分运算放大器ADA4930的分析(1)

    AD转换芯片的模拟信号输入端方式为:全差分.伪差分.单端输入,其中全差分输入的效果最佳,现阶段ADC转换器为了提高其性能,建议用户使用全差分的输入方式.(AD7982.ADS8317等都能实现信号的全 ...

  9. webpack基础配置(一)

    第一次写博客,有点小小的兴奋,也有一点点的慌张--- 我是一个小白,仅记录自己的学习过程,内容仅供参考,如果有问题的地方,还希望各位大牛多多指教,我菜,菜是原罪,但是我可以学-- 1.最基本的:如何使 ...

  10. PAT-字符串处理-B 1002 写出这个数 (20分)

    题目: 思路: 先用字符串数组存储输入数字,然后依据num[i]-'0'对输入数字求和.然后对求和后的数字,进行分割,存储到数组中,然后遍历数组,依据存储汉语拼音的字符串二维数组进行输出 注意点: 注 ...