网络编程2_网络通讯协议, socket(tcp, udp)
一. 网络通讯协议
互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准
互联网协议按照功能的不同分为osi七层或tcp/ip五层
osi七层: 应用层, 表示层, 会话层, 传输层, 网络层, 数据链接层, 物理层
tcp/ip五层: 应用层, 传输层, 网络层, 数据链接层, 物理层
各层中涉及的协议的简单解释:
1. 应用层
· DHCP (Dynamic Host Configuration Protocol) 动态主机分配协议
· DNS (Domain Name System) 域名系统(域名解析)
· FTP(File Transfer Protocol)文件传输协议
· Gopher (英文原义:The Internet Gopher Protocol 中文释义:(RFC-1436)网际Gopher协议)
· HTTP (Hypertext Transfer Protocol)超文本传输协议
· IMAP4 (Internet Message Access Protocol 4) 即 Internet信息访问协议的第4版本
· IRC (Internet Relay Chat )网络聊天协议
· NNTP (Network News Transport Protocol)RFC-977)网络新闻传输协议
· XMPP 可扩展消息处理现场协议
· POP3 (Post Office Protocol 3)即邮局协议的第3个版本
· SIP 信令控制协议
· SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议
· SNMP (Simple Network Management Protocol,简单网络管理协议)
· SSH (Secure Shell)安全外壳协议
· TELNET 远程登录协议
· RPC (Remote Procedure Call Protocol)(RFC-1831)远程过程调用协议
· RTCP (RTP Control Protocol)RTP 控制协议
· RTSP (Real Time Streaming Protocol)实时流传输协议
· TLS (Transport Layer Security Protocol)安全传输层协议
· SDP( Session Description Protocol)会话描述协议
· SOAP (Simple Object Access Protocol)简单对象访问协议
· GTP 通用数据传输平台
· STUN (Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议
· NTP (Network Time Protocol)网络校时协议
2. 传输层
· TCP(Transmission Control Protocol)传输控制协议
· UDP (User Datagram Protocol)用户数据报协议
· DCCP (Datagram Congestion Control Protocol)数据报拥塞控制协议
· SCTP(STREAM CONTROL TRANSMISSION PROTOCOL)流控制传输协议
· RTP(Real-time Transport Protocol或简写RTP)实时传送协议
· RSVP (Resource ReSer Vation Protocol)资源预留协议
· PPTP ( Point to Point Tunneling Protocol)点对点隧道协议
3. 网络层
IP(IPv4 · IPv6) Internet Protocol(网络之间互连的协议)
ARP : Address Resolution Protocol即地址解析协议,实现通过IP地址得知其物理地址。
RARP :Reverse Address Resolution Protocol 反向地址转换协议允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
ICMP :(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
ICMPv6:
IGMP :Internet 组管理协议(IGMP)是因特网协议家族中的一个组播协议,用于IP 主机向任一个直接相邻的路由器报告他们的组成员情况。
RIP : 路由信息协议(RIP)是一种在网关与主机之间交换路由选择信息的标准。
OSPF : (Open Shortest Path First开放式最短路径优先).
BGP :(Border Gateway Protocol )边界网关协议,用来连接Internet上独立系统的路由选择协议
IS-IS:(Intermediate System to Intermediate System Routing Protocol)中间系统到中间系统的路由选择协议.
IPsec:“Internet 协议安全性”是一种开放标准的框架结构,通过使用加密的安全服务以确保在 Internet 协议 (IP) 网络上进行保密而安全的通讯。
4. 数据链路层
802.11 · 802.16 · Wi-Fi · WiMAX · ATM · DTM · 令牌环 · 以太网 · FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN
5. 物理层
以太网物理层 · 调制解调器 · PLC · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线
二. tcp/ip五层模型详解
搞清楚了每层的协议, 就搞清楚了每层的主要协议
每层都运行特定的协议, 越往上越靠近用户, 越往下越靠近硬件
1. 物理层
物理层功能: 主要是基于电器特性发送高低电压(电信号), 高电压对应数字1, 低电压对应数字0
2. 数字链路层
由来: 单纯的电信号0和1没有任何意义, 必须规定电信号多少位一组, 每组什么意思
数据链路层功能: 定义了电信号的分组方式
(1). 以太网(ethernet3)协议:
一组电信号构成一个数据包, 叫做帧, 每一数据帧分成: 报头head 和 数据data两部分
head包括: (固定18个字节), 发送者(源地址)6个字节, 接受者(目标地址)6个字节, 数据类型6个字节
data包括: 最短46个字节, 最长1500个字节
数据包的具体内容: head长度 + data长度 = 最短64个字节, 最长1518个字节, 超过最大限制就分片发送
(2). mac地址:
head中包含的源和目标地址的由来: ethernet规定接入internet的设备都必须具备网卡, 发送端和接收端的地址便是指网卡的地址, 即mac地址
mac地址: 每块网卡出厂的时候都被烧制上一个世界上唯一的mac地址, 长度为48位2进制, 通常由12位16进制数表示(前6位是厂商编号, 后六位是流水线号)
(3). 广播:
arp协议: 通过ip地址获得mac地址
以太网采用最简单的方式, 广播的方式进行通信, 即计算机基本靠吼
3. 网络层
世界大网络由一个个小的彼此隔离的局域网组成, 以太网包只能在一个局域网内发送, 一个局域网是一个广播域, 以太网的广播包只能在一个广播域内发送, 跨广播域的通信只能由路由转发
网络层功能: 引入一套新的地址来区分不同的广播域/子网, 这套地址即网络地址
(1). ip协议:
规定网络地址的协议, 它定义的地址叫ip地址, 广泛采用的是ipv4, 它规定网络地址由32位2进制表示
范围0.0.0.0 - 255.255.255.255 (4个点分十进制, 也就是4个8位二进制数)
ipv6: 6个冒号分割的16进制数表示, 预防ipv4地址不够用的情况, 但是ipv4目前还是够用的, 因为我们一个公司一般就一个对外的ip地址, 我们所有的机器上网都走这一个ip出口
ip地址分为两部分: 网络部分: 标识子网, 主机部分: 标识主机
单纯的ip地址段只是标识了ip地址的种类, 从网络部分和主机部分都无法辨识一个ip所处的子网
子网掩码: 表示之网络特征的一个参数, 它的形式上等同于ip地址, 一个一个32位二进制数, 它的网络部分全部为1, 主机部分全部为0, 写成十进制就是255.255.255.0, 利用子网掩码就能判断任意两个ip地址是否处在同一个字网络, 方法是将两个ip地址和子网掩码分别进行AND运算, 然后比较结果是否相同, 如果相同就在同一个之网络中
总结一下: ip地址的作用主要有两个, 一个是为每一台电脑分配ip地址, 另一个是确定哪些地址在同一个子网络
ip数据包:
ip数据包也分为head和data部分, 无需为ip包定义单独的栏位, 直接放入以太网包的head部分
head最长为20到60个字节, data最长为65515个字节, 因此, 如果ip数据包超过了1500个字节, 就要被分割成几个以太网数据包分开发送
(2). arp协议: 地址解析协议(Address Resolution Protocol)是根据IP地址获取物理地址的一个TCP/IP协议
以官广播的形式发送数据包, 获取到目标主机的mac地址
4. 传输层
传输层的功能: 建立端口到端口的通信(端对端通信)
通过ip和mac找到了一台特定的主机(网络层的ip帮我们区分子网, 以太网层的mac帮我们找到主机码), 但是如何标识这台主机上的应用程序, 答案就是端口, 端口即应用程序与网卡关联的编号
端口范围0-65535, 0-1023为系统占用端口
127.0.0.1就是本机程序之间进行通信的地址, 这叫本机的回环地址, 测试的时候模拟客户端和服务端
(1). tcp协议: 传输控制协议
tcp把连接作为最基本的对象, 每一条tcp连接都有两个端点, 这种端点叫做套接字(socket), 它的定义为端口号拼接到ip地址即构成了套接字,
面向连接, 可靠传输, 保证送达, 安全性高, 提供超时重发, 丢弃重复数据, 检验数据, 流量控制等功能
tcp数据包没有长度限制, 理论上可以无限长, 但是为了保证网络的效率, 通常tcp数据包的长度不会超过ip数据包的长度,
(2). udp协议: 用户数据包协议
面向数据包, 不可靠传输, 只负责发送, 不保证送达, 速度快, 安全性差
报头部分一共只有8个字节, 总长度不超过65535个字节, 正好放进一个数据包
(3). tcp三次握手和四次挥手
ip协议虽然能把数据报文送到目的主机, 但是并没有交付给主机的具体应用进程, 二端到端的通信才应该是应用进程之间的通信
三次握手:
① TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
② TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
③ TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
④ TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
⑤ 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
四次挥手:
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭,一个流程。
①. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
②. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
③. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
④. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
⑤. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
⑥. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
5. 应用层
应用层功能: 规定应用程序的数据格式
例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
6. socket
我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
三. 网络通信实现
想实现网络通信, 每台主机需具备四要素: 本机的ip地址, 子网掩码, 网管的ip地址, dns的ip地址
获取这四要素有两种方式: 1. 静态获取: 即手动配置, 2. 动态获取: 通过dhcp获取
四. 结合协议来看网络通信流程
1.本机获取
本机的IP地址:192.168.1.100
子网掩码:255.255.255.0
网关的IP地址:192.168.1.1
DNS的IP地址:8.8.8.8
2.打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。
3.dns协议(基于udp协议)
域名定义:http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html
顶级域名:以.com,.net,.org,.cn等等属于国际顶级域名,根据目前的国际互联网域名体系,国际顶级域名分为两类:类别顶级域名(gTLD)和地理顶级域名(ccTLD)两种。类别顶级域名是 以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等结尾的域名,均由国外公司负责管理。地理顶级域名是以国家或地区代码为结尾的域名,如"CN"代表中国,"UK"代表英国。地理顶级域名一般由各个国家或地区负责管理。
二级域名:二级域名是以顶级域名为基础的地理域名,比喻中国的二级域有,.com.cn,.net.cn,.org.cn,.gd.cn等.子域名是其父域名的子域名,比喻父域名是abc.com,子域名就是www.abc.com或者*.abc.com.
一般来说,二级域名是域名的一条记录,比如alidiedie.com是一个域名,www.alidiedie.com是其中比较常用的记录,一般默认是用这个,但是类似*.alidiedie.com的域名全部称作是alidiedie.com的二级
4.HTTP部分的内容,类似于下面这样:
GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …
我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。
5. TCP协议
TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。
TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。
6. IP协议
然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。
IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。
7. 以太网协议
最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。
以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。
8. 服务器端响应
经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。
根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的”HTTP请求”,接着做出”HTTP响应”,再用TCP协议发回来。
本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。
五. 基于TCP和UDP两个协议下SOCKET的通讯流程
1. 对比:
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。
UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
2. tcp协议下的socket
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
但是socket绑定ip和端口时可能出现下面的问题: OSError: [Error 48] Address already in use