TCP IP Socket In C, 2e-chapter 1 Introduction
本章是基础概念,建议补计算机网络基础,这里不全.
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/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: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、协议、端口号以及主机之间的逻辑关系。
参考
TCP IP Socket In C, 2e-chapter 1 Introduction的更多相关文章
- mysql错误:Can’t create TCP/IP socket (10106) 解决方法
错误描述 “mysql错误:Can’t create TCP/IP socket (10106)”,目测是socket端口被占用的原因,然后在打开tomcat,报的错误中也包含了“socket”,再一 ...
- Linux IPC tcp/ip socket 编程
模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...
- HTTP,TCP/IP,Socket
HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议. TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据. ...
- TCP/IP Socket发送接收图片demo
一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- Android TCP/IP Socket Test
TCP/IP协议:Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...
- TCP/IP Socket 的理解
网络由下往上分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. TCP 协议对应于传输层,HTTP 协议对应应用层,Socket 则是对 TCP/IP 协议的封装. ...
- 【Java TCP/IP Socket】TCP Socket(含代码)
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...
- 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservic
TCP/IP:网络宽带,传输数据的基础协议,所有得数据要在网络上传输都是基于TCP/IP协议(或UDP),才能送达到指定的目的地(IP,服务器硬件地址). SOCKET:SOCKET只是面对编程人员的 ...
- http和tcp/ip,socket的区别
http协议和tcp/ip协议乍看起来,感觉是同一类的东西,其实不然,下面简单的说说他们的区别. http协议是应用层的一种数据封装协议,类似的还有ftp,telnet等等,而tcp/ip是数据传输层 ...
随机推荐
- maven依赖找不到,快速解决
以微信支付依赖为例子 wxpay-sdk-3.0.9.jar1.阿里云仓库搜索地址https://maven.aliyun.com/mvn/search 2.搜索你要找的依赖,对号入座 3.确保mav ...
- Hibernate之cascade属性和inverse属性
1.cascade属性 cascade属性的作用是描述关联对象进行操作时的级联特性,只有涉及关系的元素才有cascade属性.具有cascade属性的标记包括<many-to-one/>. ...
- 将js进行到底:node学习4
使用Node做web开发 HTTP与TCP 上一回使用node.js的NET(TCP)模块开发了一个聊天室demo.单纯用到了原始的TCP协议,可以说TCP是HTTP,SMTP,FTP的鼻祖了,后面的 ...
- moment获取2周后日期
moment().add('days',14).format('YYYY年MM月DD日');
- windows的各种扩展名详解
Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名.这样就可以根据文件的扩展名,判定文件的种类,从而知道其 ...
- 使用QT绘制一个多边形
目录 1. 概述 2. 实现 2.1. 代码 2.2. 解析 3. 结果 1. 概述 可以通过QT的重绘事件和鼠标事件来绘制多边形,最简单的办法就是在继承QWidget的窗体中重写paintEvent ...
- js事件的三个阶段
js事件的三个阶段分别为:捕获.目标.冒泡 1.捕获:事件由页面元素接收,逐级向下,到具体的元素 2.目标:具体的元素本身 3.冒泡:跟捕获相反,具体元素本身,逐级向上,到页面元素 IE5.5:div ...
- 零基础JavaScript编码(一)
任务目的 JavaScript初体验 初步明白JavaScript的简单基本语法,如变量.函数 初步了解JavaScript的事件是什么 初步了解JavaScript中的DOM是什么 任务描述 参考以 ...
- 使用EventBus + Redis发布订阅模式提升业务执行性能(下)
前言 上一篇博客上已经实现了使用EventBus对具体事件行为的分发处理,某种程度上也算是基于事件驱动思想编程了.但是如上篇博客结尾处一样,我们源码的执行效率依然达不到心里预期.在下单流程里我们明显可 ...
- 把.net Core 项目迁移到VS2019 for MAC
VS2019 for MAC已经发布很长时间了,本以为项目移过去很麻烦,一直没有动作,最近呆家里快发霉了,决定研究研究,没想到一句代码都不需要动,直接完功,这下可以生产了.同学们可以放心整了. 本次平 ...