Socket编程

网络协议

网络中的计算机与计算机之间要想正确的传送信息和数
据,必须在数据传输的顺序、数据的格式及内容等方面有
一个约定或规则,这种约定或规则称为协议
一个网络协议主要包含以下三个要素:

所谓计算机网络协议,就是通信双方事先约定的通信规则的集合


语法(Syntax):即数据与控制信息的结构和格式,包括数据格式、编码及信号电平等。

语义(Semantics):是用于协调和差错处理的控制信息。如需要发出何种控制信息完成何种动作以及做出何种应答等。

时序(Timing):即对有关事件实现顺序的详细说明,如速度匹配、排序等网络协议大多妥协而产生


 ISO/OSI参考模型 – 比喻

7 应用层:老板
6 表示层:相当于公司中简报老板、替老板写信的助理
5 会话层:相当于公司中收寄信、写信封与拆信封的秘书
4 传输层:相当于公司中跑邮局的送信职员
3 网络层:相当于邮局中的排序工人
2 数据链路层:相当于邮局中的装拆箱工人  
1 物理层:相当于邮局中的搬运工人
  bit


TCP/IP协议

传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议
Internet国际互联网络的基础
RFC791定义IP
RFC792定义ICMP
RFC793定义TCP
一组协议,通常称它为TCP/IP协议族
四个层次:网络接口层、网际层、传输层、应用层


常用协议

IP(Internetworking Protocol)网间网协议
TCP(Transport Control Protocol)传输控制协议
UDP(User Datagram Protocol)用户数据报协议
ICMP(Internet Control Message Protocol)互联网控制信息协议
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
SNMP(Simple Network manage Protocol)简单网络管理协议
HTTP(Hypertext Transfer Protocol) 超文本传输协议
FTP(File Transfer Protocol)文件传输协议
ARP(Address Resolation Protocol)地址解析协议


OSI中的层 功能 TCP/IP协议族


应用层          文件传输,电子邮件,文件服务,虚拟终 TFTP,HTTP,SNMP端 FTP,SMTP,DNS,Telnet
表示层          数据格式化,代码转换,数据加密 没有协议  asn
会话层          解除或建立与别的接点的联系 没有协议
传输层          提供端对端的接口 TCP,UDP
网络层          为数据包选择路由 IP,ICMP,   RIP,OSPF, BGP,IGMP
数据链路层  传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP, RARP
物理层          以二进制数据形式在物理媒体上传输数据 SO2110,IEEE802.1,IEEE802.2


IP头

版本号, IPv4取值4
首部长度, 4个字节为单位,取值范围5~15
服务类型(TOS), 指定传输的优先级、传输速度、可靠性和吞吐量等
报文总长度, 最大长度为65535字节
报文标识, 唯一标识一个数据报,如果数据报分段,则每个分段的标识都一样
标志,最高位未使用, 定义为0,其余两位为DF(不分段)和MF(更多分段)
段偏移量, 以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置
生存时间( TTL, time-to-live), 取值0~255,每经过一个路由节点减1,为0时被丢弃
协议, 指明该数据报的协议类型,如1为ICMP,4为IP,6为TCP,17为UDP等
首部校验和, 每通过一次网关都要重新计算该值,用于保证IP首部的完整性
选项, 长度可变,提供某些场合下需要的控制功能,IP首部的长度必须是4个字节的整数倍,如果选项长度不是4的整数倍,必须填充数据


AT设备记录转换状态的方式不同,NAT的类型也不同
做P2P类应用时,需要处理NAT穿越的问题。


子网掩码

通过子网掩码可以判断目标主机是否跟本主机在同一子网内
计算网络号
IP & ~netmask
计算子网广播地址
IP & netmask
计算主机号
IP与子网掩码做位与运算,得到网络号,如果网络号相同,则跟自己在同
一子网內
实际上就是做路由选择的算法
(IP & netmask) | (255.255.255.255 & ~netmask)
某网络IP分配为172.16.1.x,子网掩码为255.255.252.0,请计算该网
络的广播地址
172.16.3.255

学会配置 DNS 服务器
● /etc/resolv.conf
● /etc/hosts
● /etc/nsswitch.conf


计算子网广播地址

给定 IP 地址为 172.16.0.x ,子网掩码为
255.255.252.0
子网号: 172.16.0.x & 255.255.252.0 =
172.16.0.0
主机号全部为 1 : 0.0.3.255
结果: 172.16.0.0 | 0.0.3.255 =
172.16.3.255

Linux 系统打开路由转发

echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
如果需要支持 NAT ,还需要配置 iptables
iptables --table nat --append POSTROUTING
--out-interface wlan0 -j MASQUERADE
iptables 是 Linux 内核防火墙的配置工具
Linux 内核防火墙是 netfilter


TCP协议

TCP提供一种面向连接的、可靠的字节流服务
面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务
器)在彼此交换数据之前必须先建立一个TCP连接。

需要有连接建立的过程

有可能通过数据收发来维持连接
也有可能有专门的维持连接的指令来维持连接
需要有连接拆除的过程

通常靠几次握手来实现
通常也需要协商一些通讯的参数
需要有连接维持的过程

这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁
参与通讯的双方要释放资源,恢复状态
有可能需要提供连接恢复功能
在连接建立之后,可以进入数据收发阶段



字节流和数据报的特点


字节流特点
有明确的方向,数据会发送给建立连接的对方,耦合度高
无记录边界
字节流数据无意义(无格式),处理时需要把字节流切分,变成记录
块,这样才有意义(有格式)
管道、FIFO 、TCP传输的是字节流
数据报特点
没有明确的方向,耦合度低
有记录边界
只要记录块完整,数据报就有意义(有格式)
消息队列可以认为传输的是数据报,UDP传输的是数据报


使用TCP通讯的条件


 双方网络通
ping
traceroute
防火墙允许连接

在开发阶段,可以考虑关闭防火墙
# service iptables stop
部署时,可以配置防火墙的规则


双方的协议栈相同
同为IPv4或者IPv6
 Socket类型相同
TCP的socket类型为:SOCK_STREAM




UDP协议特点

UDP(用户数据报协议),是不可靠的无连接的协议,在数据发送
前,因为不需要进行连接,所以可以进行高效率的数据传输。
与TCP协议相比,具有传输速度高的优点。
适用情况:

发送小尺寸数据(如:对DNS服务器进行IP地址查询时,若进行连接之后
再进行数据传输就会降低效率,这时就使用UDP。)
在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
适合于广播/组播式通信中。
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采
用UDP协议   NAT穿越
流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实
时数据传输


建立连接的三次握手情况

第一次, client → server
● ● Sequence number: 5cf20c05(ISN: client → server)
Flags: SYN
Acknowledgement number: 没意义
第二次, server → client
● ● Sequence number: 9cf51be1(ISN: server → client)
Flags: SYN ACK
Acknowledgement number: 5cf20c06
第三次, client → server
● Flags: ACK
● Sequence number: 5cf20c06
● Acknowledgement number: 9cf51be2

断开连接的四次握手情况

第一次握手: 192.168.206.6 → 192.168.206.1
● ● Sequence number: 0b9b06c8
Flags: FIN, ACK
Acknowledgement number: 8b5615e4
第二次握手: 192.168.206.1 → 192.168.206.6
● ● Sequence number: 8b5615e4 ( SYN 和 FIN 需要占一个序列号,纯 ACK 不占序列号)
Flags: ACK
Acknowledgement number: 0b9b06c9
第三次握手: 192.168.206.1 → 192.168.206.6
● ● Sequence number: 8b5615e4
Flags: FIN, ACK
Acknowledgement number: 0b9b06c9
第四次握手: 192.168.206.6 → 192.168.206.1
● Flags: ACK
● Sequence number: 0b9b06c9
● Acknowledgement number: 8b5615e5



程序如何使用特权端口号

设置可执行文件的 owner 为 root 用户
将可执行文件设置为 set-uid 程序 (mode:-rwsr-xr-x)
# chown root <appname>
# chmod 4755 <appname>
在进程绑定端口号成功之后,可以调用如下的函
数将权限降低为普通用户:
setuid(getuid());


权限部分的工作机制

关于权限部分,可以参考 APUE 的以下章节:
● ● 4.4 设置用户 ID 和设置组 ID

1.8 用户标识
8.11 更改用户 ID 和组 ID
建议看看这份 manual:

http://linux.die.net/man/7/credentials


系统如何做权限检查?
● 每个进程都有 real uid, real gid, effective uid, effective gid, 添加组 ID
● 添加组 ID 怎么来?
● 某个用户可以属于多个组,其中有一个是默认组,用户所属的默认组在 /etc/passwd 中设置
● 在 /etc/group 文件里设置的是用户所属的其他组
● 该用户启动一个程序的时候,其他组就变成了进程的添加组
● 进程的实际用户 ID 从哪儿来?谁启动程序,谁就是进程的实际用户 ID
● 进程的实际组 ID 从哪儿来?谁启动程序,该用户所属的组 ID 就是进程的实际组 ID
● 通常来说,进程的有效用户 ID 等于进程的实际用户 ID ,进程的有效组 ID 等于进程的实际组 ID ,进程的添加组 ID 从用户所属的组中取得。
● 但是,如果程序本身是 set-user-id 的,那么该程序启动为进程之后,就将进程的有效用户 ID 变更为程序文件的所有者 ID
● 如果程序本身是 set-group-id 的,那么该程序启动为进程之后,就将进程的有效组 ID 变更为程序文件的组 ID
● 当进程欲操作一个文件时,按照如下的规则去检查 permission

Step 1, 检查进程的有效用户 ID 是否等于被操作文件的 owner id ,如果等于的话,进程就拥有 owner 的 permission(rwx------) ,后续的检查
不做了
Step 2, 如果进程的有效用户 ID 不等于被操作文件的 owner id ,那么检查进程的有效组 ID ,如果进程的有效组 ID 等于文件的 group id ,那
么,进程将拥有文件 group 的 permission
Step 3, 如果不符合 step 1, 也不符合 step 2 ,那么依次检查进程的添加组 ID ,如果某个添加组 ( 一个进程可以有 0 个或多个添加组 ID)ID 等
于文件的 group ,则进程拥有文件 group 的 permission
最后,上述都不满足时,进程将拥有文件的 other 的 permission


Socket控制及选项

fcntl()对文件描述符进行控制,比如设置为非阻塞方式工作等等,提供的是通用的命令,对socket这种特殊描述符

没有特殊处理,就是把socket当成描述符来对待的


ioctl()是对设备进行控制,有针对性,对不同的设备有不同的控制指令
和参数,对socket来说,可以对路由表操作,可以对接口操作有些配置既可以通过fcntl()实现,也可以通过ioctl()实现,比如设置非阻塞方式工作


setsockopt()/getsockopt()对socket进行设置,包括设置工作方式,调
整参数等,实际上是对内核里的协议栈进行操作的。

工作方式:广播
调整参数:调整缓冲区大小,超时时间等等
实现某些功能:实现多播功能


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值