对TCP/IP 与 Socket 的理解
来源:互联网 发布:管乐校音器软件 编辑:程序博客网 时间:2024/05/16 08:46
前言
单机游戏总没有联网游戏好玩,电脑联网总比没网多了很多乐趣. 网络互联,一切才那么有趣. 终于体会到surfing the internet
这个词的含义了. 而这一切的基础就是网络通信.
互联网的发展是个有趣的过程,对此感兴趣的就移步互联网简史
从接触计算机开始,我就了解很多网络术语,随着编程经历越来越多,对其认识也慢慢清晰. A Simple Introduction To Computer Networking 这篇文章对网络给出了很好解释:
- Networking is about communication
- Text is the simplest way to communicate
- Protocols are standards for reading and writing text
TCP/IP 和 Socket 是网络编程中经常涉及到概念,下面,我说说自己对它们的理解.
TCP/IP 参考模型
TCP/IP参考模型是一系列网络协议的总称,它被归类到4个抽象的”层”中。每一抽象层创建在低一层提供的服务上,并且为高一层提供服务。 完成一些特定的任务需要众多的协议协同工作.
更多详尽的解释见维基百科 或者百度百科
为什么需要协议
类比到日常生活中场景,如果A说粤语,B说闽南语,肯定没法交流,所以就需要一个标准,都说普通话就解决了,于是协议应运而生. 下面这张图给出了形象的解释:
上述描述不准确,待更.
有几点需要确认:
每一层都是必须的吗? 可不可以去掉几层. 这个要追溯到互联网的发展历史.
A说”Hello”,B收到”Hello”,完成了通信,所以上述例子不足以说服.
TCP/IP 模型
下面图示给出了TCP/IP结构:
从上到下的四层,分别为应用层(Application Layer), 传输层(Transport Layer), 网络互联层(Internet Layer), 网络接口层(Link Layer)。
越往下离硬件越近,越往上离用户越近.
可以这样理解它们的作用:
1.应用层是针对特定应用的协议,是直接与用户打交道的层,典型协议有HTTP,FTP,telnet,DNS,SMTP,SSH等。
2.传输层管理两个节点之间的数据传输, 能够解决诸如端到端可靠性(“数据是否已经到达目的地?”)和保证数据按照正确的顺序到达这样的问题,典型协议有TCP,UDP等;
3.网络互联层解决在一个单一网络上传输数据包的问题,典型协议有IP,ICMP等;
4.网络接口层负责建立电路连接,是整个网络的物理基础,典型的协议有以太网、ADSL等等;
理解这个结构的关键,在于理解科学家在70年代设计互联网的原始目的,就是为了传输文本。所有协议最初都是为了这个目标而设计的,互联网架构的核心就是文本对话。
关于各层更详尽的解释请移步维基百科
Socket
认识socket
socket 又名套接字.
socket原意是 “插座”,可以看成是在两个程序进行通讯连接中的端点,是连接应用程序和网络驱动程序的桥梁。Socket在应用程序中创建,通过绑定与网络驱动建立关系。套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
socket的使用
1.通信流程
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
2.实例
附上Java服务器和python客户端通信的一个例子.
Java 服务器:
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class JavaServer { public static void main(String[] args){ try{ ServerSocket ss = new ServerSocket(8456); System.out.println("wait the client to link..."); Socket s = ss.accept(); System.out.println("Client: "+s.getInetAddress().getLocalHost()+" connected."); ////建立IO流接受客户端发来的消息 BufferedReader br = new BufferedReader( new InputStreamReader(s.getInputStream())); String mess = br.readLine(); System.out.println("From client:-> "+mess); //建立IO输出流向客户端发送数据消息 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); bw.write("I have revieved.."+"\n"); bw.flush(); /** 关闭socket **/ }catch(IOException e){ e.printStackTrace(); } }}
python 客户端:
#!/usr/bin/env pythonimport socketimport jsonHOST = "localhost"PORT = 8456sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((HOST, PORT))def test(): message=input('client send> ') while message !='q': sock.sendall((message+'\r').encode()) #'\r'必须,因为服务端必须受到回车才认为消息结束 data = sock.recv(1024).decode() print('Received from server: '+data) message=input('- > ') sock.close()if __name__ == '__main__': test()
结论
TCP/IP 协议不等同与TCP/IP参考模型.
TCP协议对应于传输层,IP协议对应于网络层.
socket可以看做是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能方便地实现TCP/IP协议,因为不需要考虑数据传输过程中的细节。
Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
关于它们之间的区别请移步TCP/IP、Http、Socket的区别
参考文献
1.TCP/IP协议族
2.A Simple Introduction To Computer Networking
3.互联网协议入门(一)
4.TCP/IP模型的一个简单解释
5.互联网简史
6. 图解TCP/IP
7. 揭开Socket编程的面纱
8. 简单理解Socket
- 对TCP/IP 与 Socket 的理解
- 对TCP/IP,socket,HTTP的理解
- 对Socket通信、TCP/IP和Http的理解
- 对Socket通信、TCP/IP和Http的理解
- Tcp/IP的理解-socket
- socket,TCP/IP的理解
- 对TCP/IP的理解
- 对Socket的理解,Socket使用TCP/IP如何实现通信
- 关于socket tcp/ip的理解
- TCP/IP、Http、Socket的关系理解
- Android tcp/ip socket http的理解
- 对TCP/socket编程的个人理解
- 对TCP/IP的浅显理解
- 对TCP/IP协议的理解
- 对TCP/IP三次握手的理解
- 关于对Tcp/Ip的理解
- 对tcp/ip协议的理解
- socket 与tcp/ip
- popupWindow 在title下面显示铺满的图片
- Unity3D Resources Load 资源加载测试
- Qt中使用cout, cin, cerr
- 推荐一个Python包thefuck
- 让你的JS更优雅的小技巧
- 对TCP/IP 与 Socket 的理解
- 从一个php文件向另一个地址post数据(不用表单和隐藏的变量)
- socket之connect
- 微信小程序 "enablePullDownRefresh" 下拉刷新无效
- 老方块sql总结
- php导出到excel
- vue双向数据绑定原理探究(附demo)
- 【Java集合类源码分析】LinkedHashMap源码分析
- Java:int a=0;a=a++;问:a=?