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是数据传输层 ...
随机推荐
- 写个匹配某段html dom代码某属性的正则匹配方法
private static string GetHtmlDomAttr(string html, string id, string attrname) { string xmatchstring ...
- LG_2869_[USACO07DEC]美食的食草动物Gourmet Grazers
题目描述 Like so many others, the cows have developed very haughty tastes and will no longer graze on ju ...
- 用VS2013进行调试
首先新建一个简单的C++程序 打开VS2013-文件-新建-项目-选择Win32 控制台程序 添加-新建项-选择C++源文件 编写如下代码 #include<iostream> using ...
- 简单了解char和varchar的区别
一.CHAR和 VARCHAR的区别? 1.CHAR有固定的长度,VARCHAR属于可变长度的字符类型. 2.比如,写入内容到CHAR(10)里,如果内容占用的空间不够10,则会用空格字符补足. 二. ...
- Drools 7.15.0 docker容器方式部署
关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间. 一.快速部署 1.拉取基础镜像,命令如下: d ...
- hexo文章编写部分语法总结以及hexo使用
一.hexo的使用 1.1 新建一篇文章 1 $ hexo new [layout] <title> 1.2. 生成静态文件 1 $ hexo generate 可简写为 1 $ hexo ...
- WiredTiger运行时参数优化
MongoDB的WiredTiger存储引擎,用了一段时间,遇到了一些问题,通过优化WT参数,也解决了一些问题,做个小结. cache_size 指定WT存储引擎内部cache的内存用量上限. 需要注 ...
- Cisco模拟器的基本使用
获取帮助查找命令 只需输入一个'?'便可得到详细的帮助信息,如果想获取c开头的命名,那么直接输入'c?'即可. 在各个模式下切换的方法 给如图所示路由器接口配置IP地址 第一步:安装HWIC-2T(串 ...
- vue 实现 裁切图片 同时有放大、缩小、旋转功能
实现效果: 裁切指定区域内的图片 旋转图片 放大图片 输出bolb 格式数据 提供给 formData 对象 效果图 大概原理: 利用h5 FileReader 对象, 获取 <input ty ...
- H5系列一、静态页面总结
1.img父标签设置高度,如果容器没有设置高度的话,图片会默认把容器底部撑大几像素 -- 大概3px,给容器设置高度. 2.input标记换行后默认有一个间隙,设置float属性.input标记默认还 ...