再一次地,把网络7层模型放在前面:
1. socket的位置
在介绍了传输层(TCP/UDP)、网络层(IP),理论上,我们已经可以开始编写应用程序来使用这些层了。然而由于这些协议过于复杂,操作系统在应用程序与协议栈之间提供一个软件接口socket套接口。
第一个值得注意的地方就是socket套接口的位置,套接字承上启下,应用层可直接使用套接口实现网络编程。
2. socket类型
- socket有三种类型,数据报、流式、原始。显然,前两者分别对应UDP和TCP,第三种则对应不是上述两者协议的。
- 注意,只有相同的套接口直接才能进行通信。
3. socket地址
- 通用地址结构——sockaddr
struct sockaddr { unsigned short sa_family; // 地址家族 char sa_data; // 协议地址 };
- INET协议族地址结构——sockaddr_in
struct sockaddr_in { short sin_family; //地址家族 u_short sin_port; //端口号 struct in_addr sin_addr; //IP 地址 unsigned char sin_zero[8]; //Unused }; 其中,IPv4地址结构in_addr: struct in_addr { unsigned long s_addr; };
上述地址之间的关系如下所述:
4. socket及其地址的通俗解释
刚学习的时候可能会疑惑,为什么socket需要有地址?socket地址到底是什么?
socket可以理解为一个手机或者电话,仔细看socket地址的内容是IP和端口,也就是电话的号码(IP)与分机号(端口号)
- 当往外打电话时,我们只需要知道对方的电话号码和分机号即可;所以socket如果只用来发送数据,无需手动绑定socket地址,操作系统会帮忙做。
- 如果一部电话是用来接电话的,这部电话是必须先绑定好自己的电话号码和分机号;也就是说socket必须bind自己的socket地址。
5. 使用socket编程
socket相关的理论就先介绍到这里,在掌握了socket这个法宝之后就可以开始编程实现UDP或TCP通信了。
Linux网络编程06——UDP协议编程:https://blog.csdn.net/lianghe_work/article/details/45170699
Linux网络编程09——TCP编程之客户端:
https://blog.csdn.net/lianghe_work/article/details/46411927
Linux网络编程–tcp服务器:
https://blog.csdn.net/lianghe_work/article/details/46468001
6. 参考
- http://www.jiaochengku.net/ITjiaocheng/wangluobiancheng/41947.html
- http://homepage.smc.edu/morgan_david/cs70/sockets.htm