TCP/IP是什么
TCP/IP是什么要是讲清楚,我能对着计算机网络书抄出一本书这么厚,所以这里就言简意赅的总结下实用的体会,从计算机基础开始推论
- 根据理想化计算机网络模型,应该分为7层(哪七层去查书)
- 实际上的操作中是分为了4层(哪四层也去查书)
- 在传输层需要通过协议来真正的传输二进制数据(数据流)
- 就像打电话一样需要电话号码和有人接通
- IP协议就是电话号码的作用
- TCP协议就是检查是否接通的作用
广义的TCP/IP协议簇是指4层计算机分层中,每一层的作用和其具体使用的协议,而狭义的TCP/IP就是指这两个协议
- TCP协议: Transmission Control Protocol
- IP协议: Internet Protocol
TCP/IP怎么用
IP协议最常见的就是IPv4,首先来讲IP协议重要的两个部分
- 地址: 相当于电话号码,具体哪一台计算机
- 端口: 相当于接听人,具体需要计算机中的哪个程序来接收数据
当我们知道了要打电话到哪里(地址),找哪个人接听(端口),此时就需要TCP协议来确定这个人在不在(链接是否建立),就是经常听到的三次握手,三次握手的通俗解释
- A打电话到B: 滴滴滴,B你在不在(第一次握手)
- B听到铃声: 拿起电话大喊一声,老子在这呢(第二次握手)
- A听到B的大喊: 听到大喊后,先寒暄一句原来你小子在家啊(第三次握手)
- 开始聊天(传输数据)
由此可见TCP/IP协议其实是两个不同的东西,IP协议本身并没有传输数据的功能,而且也不具备连接性,是一种定位手段,而TCP的三次握手才是数据传输的作用
Socket是什么
TCP/IP这些概念性的东西讲完了,但是和编程有毛线关系呢,这是不少初学者的一个困惑.和编程有关系的就是Socket,Socket是TCP/IP的实现
Socket本身就是TCP/IP的一个规范,就是大家都约定好了函数名和函数调用顺序.
因为TCP/IP报文很复杂,而且是二进制流(人眼看不懂),不可能让每个开发者自己去检查3次握手(见下文讲解).
通过约定好的Socket规范,程序员就可以方便的进行数据的发送和传输.其主要函数包括
- 初始化函数int socket(int domain, int type, int protocol);
- 绑定函数int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 监听函数int listen(int sockfd, int backlog);
- 链接函数int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 接收函数int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
其详细作用可以参考这篇文章,其中绑定函数是服务端调用,而链接函数则是客户端调用
Socket的历史
七十年代中,美国国防部高研署(DARPA)将TCP/IP的软件提供给加利福尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。这个API称为Socket接口。九十年代初,由Microsoft联合了其他几家公司共同制定了一套 WINDOWS下的网络编程接口,即Windows Sockets规范。
三次握手怎么实现的
三次握手是通过TCP报文中的序号与标记实现的,TCP报文的结构需要看书自己学习,这里仅仅对稀泥蟹使用图解进行解释
第一次握手
第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0
第二次握手
第二次握手,服务器收到客户端发过来报文
- 由SYN=1知道客户端要求建立联机。
- 向客户端返回一个SYN和ACK都置为1的TCP报文
- 设置返回报文中初始序号Y=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1 = 0+1=1, 如下图
第二次握手报文
第三次握手
第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确
- 第一次发送的序号加1(X+1=1)
- 以及标志位ACK是否为1。
若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功