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是数据传输层 ...
随机推荐
- 省A类竞赛二等奖--村先游项目VUE前端重构
村先游--省二竞赛项目VUE重构 源码地址: 重构前的(前端+后台):https://github.com/Archer-Fang/cunxianyou 重构前的(前端):https://github ...
- ibator使用
一.ibator是一个ibatis的代码生成工具,它能根据数据表自动生成javabean.sqlmap. ibator的官方地址是 http://ibatis.apache.org/ibator.ht ...
- 提高你css技能的css开发技巧
好久没整理博客了 进来啰嗦两句 继续抄别人的博客 一.resize实现图片对比 resize的语法如下: resize:none | both | horizontal | vertical 案例 ...
- linux下好用软件全记录
开发工具 1. Shutter 抓图工具(用过linux最好的抓图工具,类似win下的Snagit) 2. RabbitVCS SVN客户端(可以和subversion媲美的svn客户端) 3. My ...
- FBI今年最重要的任务:招募黑客
当FBI(联邦调查局)一次又一次被爆出丑闻的时候,面临着一个又一个的尴尬局面.在这样的情况下,FBI发现了自己的一个巨大问题,那就是以前都依靠隐秘行动和人员的保密性来保证国家的安全,现在必须依靠更 ...
- 【原创】面试官问我G1回收器怎么知道你是什么时候的垃圾?
这是why技术的第36篇原创文章 上面的图片是我上周末在家拍的.以后的文章里面我的第一张配图都用自己随手拍下的照片吧.分享生活,分享技术,哈哈. 阳台上的花开了,成都的春天快来了,疫情也应该快要过去了 ...
- LLVM 中间代码归纳
Identifiers 标识符 @ 全局 % 局部 后接字符串 命名量 @name %name 无符号数字 未命名量 @42 %42 类型系统 void 空类型 <type> * 指针类型 ...
- 全差分运算放大器ADA4930的分析(1)
AD转换芯片的模拟信号输入端方式为:全差分.伪差分.单端输入,其中全差分输入的效果最佳,现阶段ADC转换器为了提高其性能,建议用户使用全差分的输入方式.(AD7982.ADS8317等都能实现信号的全 ...
- webpack基础配置(一)
第一次写博客,有点小小的兴奋,也有一点点的慌张--- 我是一个小白,仅记录自己的学习过程,内容仅供参考,如果有问题的地方,还希望各位大牛多多指教,我菜,菜是原罪,但是我可以学-- 1.最基本的:如何使 ...
- PAT-字符串处理-B 1002 写出这个数 (20分)
题目: 思路: 先用字符串数组存储输入数字,然后依据num[i]-'0'对输入数字求和.然后对求和后的数字,进行分割,存储到数组中,然后遍历数组,依据存储汉语拼音的字符串二维数组进行输出 注意点: 注 ...