对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结构:

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

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 力帆620噪音大是怎么办 离职证明不给开怎么办 交离职报告不批怎么办 比亚迪s7噪音大怎么办 比亚迪f3噪音大怎么办 买房首付差10万怎么办 车贷合同没给我怎么办 车内老是有灰尘怎么办 车在北京怎么办进京证 五证合一后社保怎么办 五证齐全烂尾了怎么办 5万罚款交不起怎么办 炼铅环保手续要怎么办 贴膏药过敏红肿太痒了怎么办 没工作想贷款5万怎么办 燃气管超过2米了怎么办 建行燃气卡丢了怎么办 周浦燃气卡丢了怎么办 长沙燃气卡丢了怎么办 郑州燃气卡丢了怎么办 租房燃气卡丢了怎么办 洛阳燃气卡丢了怎么办 零线火线都带电怎么办 档案里年龄错了怎么办 档案年龄大了怎么办呢 吃菌子致幻了怎么办 野外吃了毒蘑菇怎么办 头顶头发稀少怎么办头顶头发稀 遇见无赖的人该怎么办 扶了老人被讹诈怎么办 遇见碰瓷讹人的怎么办 假机油用了4年怎么办 苹果6手机变砖头怎么办 苹果8升级变砖头怎么办 苹果id锁变砖头怎么办 钥匙断在锁里了怎么办? u型锁忽然打不开怎么办 密码门锁没电了怎么办 智能门锁没电了怎么办 十字锁钥匙丢了怎么办 罐头的拉环断了怎么办