您的位置:首页 > 理论基础 > 计算机网络

对TCP/IP 与 Socket 的理解

2017-05-08 16:00 120 查看

前言

单机游戏总没有联网游戏好玩,电脑联网总比没网多了很多乐趣. 网络互联,一切才那么有趣. 终于体会到
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 python

import socket
import json

HOST = "localhost"
PORT = 8456

sock = 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: