TCP及socket通信原理

一、网络互联模型

因特网在刚面世时,只有同一制造商生产的计算机才能彼此通信,制定网络互联模型的目的就是为异种的计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。

互联参考模型:

OSI七层模型(Open System Interconnect):应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

DoD四层模型:是OSI七层模型的浓缩版,包括 进程/应用层、主机到主机层、因特网层、网络接入层

以上两种模型是层次型的,分层模型的优点主要在于:

①将网络通信过程划分为更小、更简单的组件,这有助于组件的开发、设计和故障的排除

②定义了模型每层执行的功能,从而鼓励了行业标准化

③让不同类型的网络硬件和软件能够彼此通信

④避免对一层的修改而影响其它层

二、传输层协议

目前主流的传输层协议有TCP和UDP。SCTP是TCP的改进版,DCCP是一个用来取代UDP的新的非可靠传输协议

1、UDP(User Data Protocol,用户数据报协议):一种无连接的协议,提供面向事务的简单可靠信息传送服务,不建立会话,不对数据分段,不编号不排序,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。但正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序

常用的UDP端口号有:DNS 53,TFTP 69,SNMP 161

2、TCP(Transmission Control Protocol,传输控制协议):一种面向连接的、可靠、基于字节流的传输层通信协议。

TCP实现可靠性的机制:

①以通信双方之间建立连接

②TCP把数据流分割为适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。

③TCP为了保证不发生丢包,就给每个报文段一个序号,同时序号也保证了接收端的按序接收。TCP报文段的到达也可能会失序,如有必要,TCP将对收到的报文段进行重新排序,将收到的数据以正确的顺序交给应用层

④接收端对已成功收到的包发回一个相应的确认(ACK);如果发送端在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传

⑤TCP用校验和函数来检验报文段是否有错误,在发送和接收时都要计算校验和,接收端若发现校验和有差错,将丢弃这个报文段和不确认收到此报文段。

⑥TCP还能提供流量控制:缓冲区(发送缓冲区、接收缓冲区)滑动窗口

⑦在拥塞控制上,采用慢启动拥塞避免算法

▲TCP在正式传输数据前需要经过三次握手建立连接,其过程如下:

①客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

②服务器端收到SYN报文,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

③客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

▲在数据传输完毕后需要经过四次握手终止连接,其过程如下:

①某个应用进程首先调用close(),称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节(文件结束符),表示数据发送完毕。

②接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。

注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

③一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,这导致它的TCP也发送一个FIN。

④接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。

▲TCP协议通过tcp状态来标记当前处于通信过程的哪个阶段:

CLOSED, LISTEN, SYN_SENT(主动打开), SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED

三、套接字

1、套接字(socket):应用层通过传输层进行数据通信时,TCP和UDP会遇到同时会多个应用程序进程提供并发服务的问题。区分不同的应用程序进程间的网络通信和连接,主要有三个参数:通信的目标IP地址、使用的传输层协议(TCP或UDP)、目标端口号,这种组合称为套接字。

session:ip:port<==>ip:port

端口分类

众所周知的端口:0~1023,管理员才有权限使用,永久地分配给某应用使用;

注册端口:1024~41951:只有一部分被注册,分配原则上非特别严格;

动态端口或私有端口:41952+

/proc/sys/net/ipv4/ip_local_port_range:定义两个数字,表示可以做为临时端口的起始数字和结束数字

2、套接字类型:

tcp socket(流式)

udp socket(数据报式)

raw socket(不使用TCP或UDP协议,应用层的应用程序直接通达IP层)

3、socket通信在domain中实现,不同domain的socket地址格式不同在unix
domain中是一个文件路径名,在ipv4 domain中是ipv4地址加端口号
,在ipv6 domain中是ipv6地址加端口号

domain:

Unix domain:基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX,AF_LOCAL

IPv4 domain:AF_INET,基于socket机制借助于ipv4协议实现不同主机(也可是同一主机)上的进程间的通信

IPv6 domain:AF_INET6

▲虽然IPv4 domain能实现不同或同一主机进程间通信,但是对于同一主机进程间的通信应尽量使用Unix domain,socket在Unix domain中实现通信的方式就是在内存中创建一个可读写的文件作为进程间交互的中介,这种方式绕过了网络协议栈,节省了系统资源,提高了通信效率。

4、tcp socket通信相关的系统调用

socket():创建一个新的socket

bind():绑定于一个套接字地址上(服务器端会用到)

listen():监听套接字

accept():接收连接请求

connect():发起连接请求

close():关闭连接

时间: 2024-08-24 13:32:52

TCP及socket通信原理的相关文章

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

马哥教育第二十天TCP及socket通信原理详解、http协议、httpd

1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      常用端口:0-1023:管理员才有权限使用,永久地分配给某应用使用      注册端口:1024-41951:只有一部分被注册,只要确保主机上没有进程使用该端口.      动态端口或私有端口:41952-65535:由内核分配临时端口,如果临时端口不够可以通过修改内核参数修改临时端口范围       /proc/sys/net/ipv4/ip_local_port_range:定义两个

Socket通信原理简介

Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output). Unix的计算机处理IO是通过文件的抽象.计算机不同的进程之间也有输入输出,也就是通信.因此这这个通信也是通过文件的抽象文件描述符来进行. 在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(soc

Java基础知识强化之网络编程笔记02:Socket通信原理图解

1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网络通信其实就是Socket间的通信.  • 数据在两个Socket间通过IO传输. 2.  Socket通信原理图解:

socket通信原理

什么是socket 所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. SOCKET连接过程 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 服务端: 1.先初始化socket 2.创建socket,开始监听整个网络的连接请求. 3.当检测到来自客户端的连接请求时,向客户端发送连接请求的信息,并建立与客户端之间的连接. 4.与客户端进行通信 5.完成

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

【Python之旅】第五篇(一):Python Socket通信原理

只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理. 1.Socket socket也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.可以列举中国移动或者是中国电信等的电话客服,当然,也可以看下面的图片来作形象的说明. socket起源于Unix,而Unix/Linux基本哲学之一就是:一切皆文件,即都可以用"打开open-

基于TCP的Socket通信

这里的例程跟前面"基于TCP的Socket"类似,前面是客户端给服务器端发信息,这里是服务器端给客户端发信息 TCP通信模式: TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信两端之间形成网络虚拟链路. 一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信. Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信. SimpleServer.java  服务器程序,不需要建立Android项目,

Java系列讲座一:TCP方式Socket通信案例讲解

开发网络通信软件,如QQ,阿里旺旺等即时通讯软件时,Socket通信是必备的基础知识,今天跟大家谈谈Socket通信中TCP方式通信的软件开发步骤及主要代码讲解: 第一步:开发服务器端程序Server.java,源代码如下: package T16; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; imp