socket入门
前言
本文基于维百链接下的Beej’s Guide to Network Programming,介绍一些网络编程的基础,主要是该书的摘要吧。
注意,本文所有非特殊IP地址均为随机生成,请勿随意打开
本文代码是基于Linux平台上的c代码
实际上我并没有运行过,因为我都是直接复制粘贴的
什么是socket(套接口)
两类socket
有两类socket协议,一类是stream socket,另一类是datagram socket.简称分别为SOCK_STREAM,SOCK_DRGAM。
stream socket使用TCP(Transmission Control Protocol),TCP使得stream socket的传输packet的效率大大提高(即几乎不丢包)
而datagram socket可使用ip(Internet Protocol)和UDP(User Datagram Protocol),不过UDP不保证质量
使用socket貌似并不需要知道TCP怎么实现的,所以作者并没有介绍三次握手之类的
UDP的优点是快,故在线游戏和流媒体(在线视频)等对于丢包现象可以容忍的地方有他的应用,但即时聊天这类对连接的质量有要求的会使用TCP。
更多的背景知识
Data Encapsulation
以SOCKET_DRGAM为例,数据封装(Data Encapsulation)指Packet在进入下一层协议时,会被本层协议封装,只留下一个头字段(Header);正因为此,socket编程只需要注意本层的协议就可以。
臭名昭著的Layered Network Model (ISO/OSI)
Layered Network Model 提供了一种理想的模型,如下:
- Application
- Presentation
- Session
- Transport
- Network
- Data Link
- Physical
但是这种模型太笼统了以至于我们甚至可以把它当成汽车维修指南用,一种适用于Unix上的模型如下
- Application Layer (telnet, ftp, etc.)
- Host-to-Host Transport Layer (TCP, UDP)
- Internet Layer (IP and routing)
- Network Access Layer (Ethernet, wi-fi, or whatever)
此时你可以看出Unix上的数据是如何被封装和释放的了。
routing(路由)
对于没学过的人,完全可以对此不了解;但如果真的很在意,请查看
IP RFC。
stream socket和datagram socket的具体区别
鸣谢译者
stream(串流式)socket 是指应用程序要传输的数据就如水流(串流)在水管中传输一般,经由这个 stream socket 流向目的,串流式 socket 是数据会由传输层负责处理遗失,依序送达等工作,以在传输层确保应用程序所送出的数据能够可靠且依序抵达,而应用程序若对数据有可靠与依序的需求时,使用 stream socket 就不用自行处理这类的工作。
datagram(信息式)socket 是基於讯息导向的方式传送数据,应用程序送出的每笔数据会如平信的概念送出,由於遶送数据包的路径可能会随着网路条件而改变,每笔数据抵达的顺序不一定会按照送出的顺序抵达,并且如平信般,信件可能在递送过程遗失,而寄件人并无法知道是否递送成功。
初步简单知道应用这两种 sockets 的时机:当需要数据能完整送达目地时,就使用 stream socket,若是部分数据遗失也无妨时,就可以使用 datagram socket。
IP地址,结构,和数据整理(Data Munging)
IPv4和IPv6
在IPv4(Internet Protocol version 4)中,ip地址由4个8位字节组成,通常写成数字和句点,例如192.0.2.111。
因为每一个进行互联网连接的设备都有一个IP,无论是电脑还是智能手机还是公园的停车计时牌,所以为了防范IP被用光,IPv6被提出了。
IPv6的表示地址与IPv4不同,他是8个4位的十六进制数,在表示时中间使用分号分开。例如2001:0db8:c9d2:aee5:73e3:934a:a5ae:9551。并且大多数情况下,IPv6的地址中都有大量的0,此时这些连续的0可以省略。同时,也有将IPv4的IP转换为IPv6的手段,例如192.0.2.33在IPv6中记作::ffff:192.