‘壹’ 操作系统是如何将socket接受的数据发送给应用层的
在正篇开始之前,我先提问几个问题,不知道你是否全都了解:
(1) 网络请求是通过http发送的吗?
(2) http与tcp之间的关系?
(3) 网络请求是怎么发送的,通过什么形式去发送的?
在过往对于http与tcp的理解其实只是一个简单模糊的概念,仔细想想其实http只是一种协议,tcp只是用于建立一个持久连接,它们都不是用于网络发送数据的根本,真正发送数据的是我们的物理层,http协议只是作为一个标识的作用,简单来说是定位到某一主机。
下面来介绍一下计算机网络体系结构
计算机网络分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层以及应用层,由于7层太多所以后面经过演变之后定为5层,把应用层,会话层,表示层给合统称为应用层,我们客户端的每一步操作,举个例子,当我们点击发送按钮请求网络的时候,这时候会通过应用层逐渐往下传递直到物理层,物理层会提供一个互联网网络接口,这时候才真正通过互联网开始传输数据,这里最主要介绍的是传输层以及物理层,其它的网络一下,传输层是第一个端到端的层次,也是进程——进程的层次。
主要功能是实现端到端的可靠数据传输、复用与分解、连接控制、流量控制和拥塞控制(这些东西都是定义去网络一下,比如说流量控制,其实就是控制数据的发送量,你不能一次性发送很多数据,原因想一下就知道了),客户端的每一步操作都会在这5层体现出来,查下定义之后就会一目了然(比如说在我们终止会话,这时候就是由会话层管理,实体间交换数据的语法,解决格式和数据表示的差别是由表示层来完成等),在我们建立连接的时候比如说发送一个http请求(原理跟后面的socket数据传输模块是一样的),我们会先建立一个tcp连接,然后发送http请求,这时候数据会经过传输层,传输层里携带了发送数据的报文(比如ip地址,端口号之类的,数据内容),向下传递到物理层,物理层最后会提供一个互联网网络接口去发送数据,数据是以比特流的形式发送,发送到交换机上面(交换机是什么,去网络查一下,不做解释),交换机是有多个的,当我们数据非常大的时候,数据会被分解发送到多个交换机上面,传到对方客户端或者服务器的时候数据会重新整合起来,上面的是一个简单的http请求,下面来介绍一下Socket。
1.Socket的整体流程:
udp客户端:创建套接字,发送数据,接收数据,关闭套接字。
udp服务端:创建套接字,绑定地址和端口号,接收数据,发送数据,关闭套接字。
tcp客户端:创建套接字,建立连接,发送数据,接收数据,关闭套接字。
tcp服务端:创建套接字,绑定地址和端口号,设置监听,建立连接,发送数据,接收数据,关闭套接字。
这些理解起来很容易,我们客户端是要发送数据的,服务端需要接收数据,所以服务端要绑定地址和端口号,而tcp是需要三次握手的所以要有监听。
2.Socket三次握手
第一次握手,客户端发送请求给服务端(询问是否可以建立连接)。
第二次捂手,服务端回应给客户端一个确认,接受连接或者拒绝连接
第三次握手,经过确认之后,客户端回应给服务端(意思是我要开始发送数据了,下一步就开始发送了)。
理解三次握手,为什么要三次,第一次握手确认客户端可以发送请求,第二次握手确认服务端可以接收并且发送,第三部确认客户端可以接收。
3.Scoket四次挥手
第一次挥手,客户端向服务器发送断开连接请求
第二次挥手,服务端回应客户端(意思是,稍等等我数据传完(处理完的意思),在断开)
第三次挥手,服务端回应客户端断开请求(可以断开了)
第四次挥手,客户端与服务端请求断开。
tcp连接是面向连接的,数据发送可靠,udp是面向无连接的,数据发送过后就不管了,下面介绍一下tcp为什么数据可靠
具体方法如下:
差错检测:我们发送数据的时候刚刚说过是由物理层提供的互联网网络接口以比特流的形式进行发送,那么这个时候差错检测利用差错编码实现数据包传输过程中的比特差错检测,保证数据正确性
确认:接收方向发送方反馈接收状态。ACK(肯定确认);NAK(否定确认)
重传:当没有接收到反馈状态。ACK(肯定确认);NAK(否定确认)的时候,或者请求超时的时候进行重新发送
计时器:内部检测,一个定时器,当数据在一定时间没有接收到确认的时候就认为发送失败,进行重传操作。
序号:刚刚说了重传有两种情况,那么当重传是因为网络超时引起的,那么这个时候计时器进行了一次重传,然后上次超时后并没有发送失败这个时候也发送成功了,这个时候就会造成数据错乱,那么序号就起了一个作用,就是给数据进行排序,以至于不错乱。
下面来说一下tcp可靠传输协议滑动窗口协议
左边的代表的是接收的数据,中间代表的是正在处理的,右边代表的是没有处理的,在我们发送数据的时候比如56789这些数据发送,56成功了,这时候窗口就会往右移动,接收的时候呢,当我们接收比如56,接收成功了,这时候窗口往右移动,这里有一个需要注意一下,比如说当我们5没有发送成功或者说5没有接收成功,而6发送成功了,这时候窗口是不会往右移动的,它会等待5发送成功后在往右移动,浮动窗口协议里还有GBN协议和SR协议,这两个的主要区别是,GBN协议的发送窗口只能发送一个,比如上面中间准备发送的5678就只能存在5一个,但是接收窗口是可以有多个的,SR协议是可以发送窗口与接收窗口都是可以多个的。
最后总结一下http请求与socket的差异,socket是套接字,用于将报文传输到传输层,http请求在发送的时候会建立tcp连接,所以http也会分为http持久性连接和非持久性连接,至于网络传输都是要经过物理层才能传输,数据经过多个交换机进行分解,传到服务器的时候在进行整合。
网卡接收到数据根据数据头,将数据写到对应的内存,并发出中断,系统接收到中断,然后通知应用吧?
VC中客户端socket与服务器连接后,需要执行一个封状的操作
朝服务器发送一些数据(命令),然后返回结果
假设全部才字符串,类似这样的函数
CString SendCommand (CString cmd,socket sk)
要求在执行这个函数的时候能同时响应用户界面操作
也就是要用异步方式
而且这个socket已经建立好,有RecvTheard在处理
我目前是用Event实现的,很别扭:
m_hevtReadStore=CreateEvent(NULL,false,FALSE,NULL);
//m_tcp是封装的socket基本操作类
‘贰’ TCP/IP和Socket 是什么关系啊
TCP协议是可靠的传输协议,TCP在通讯前需要先进过三次握手建立连接,而Socket就代表这个连接,由端口号+iP地址组成
‘叁’ socket通信原理
socket通信原理是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以棚氏向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
Socket在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符(file descriptor)。
Socket 保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个 Socket 对象,然后通过 Socket 对象对数据进行传输。通常链迟散服务器处于一个无限循环,等待客户端的连接。
(3)计算机网络原理socket扩展阅读
SOCK_STREAM类型的套接口为全双向的字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用closesocket()。带外数据根据规定用send()和recv()来接收。
实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。如果终端协议有缓冲区空间,且数据不能在一定时间成功发送旦袜,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。
SOCK_DGRAM类型套接口允许使用sendto()和recvfrom()从任意端口发送或接收数据报。如果这样一个套接口用connect()与一个指定端口连接,则可用send()和recv()与该端口进行数据报的发送与接收。
‘肆’ socket是什么呀
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。
套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。
通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。
Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
类型
1、数据报套接字
无连接套接字,使用用户数据报协议(UDP)。在数据报套接字上发送或接收的每个数据包都单独寻址和路由。数据报套接字不能保证顺序和可靠性,因此从一台机器或进程发送到另一台机器或进程的多个数据包可能以任何顺序到达或可能根本不到达。在数据报套接字上发送广播可能需要特殊配置。
为了接收广播数据包,数据报套接字不应该绑定到特定地址,尽管在某些实现中,当数据报套接字绑定到特定地址时也可能接收广播数据包。
2、流套接字
面向连接的套接字,使用传输控制协议(TCP)、流控制传输协议(SCTP) 或数据报拥塞控制协议(DCCP)。流套接字提供了无记录边界的有序且独特的无错误数据流,并具有用于创建和销毁连接以及报告错误的明确定义的机制。
流套接字以带外功能可靠地、有序地传输数据。在 Internet 上,流套接字通常使用 TCP 实现,以便应用程序可以使用 TCP/IP 协议在任何网络上运行。
3、原始套接字
允许直接发送和接收 IP 数据包,无需任何特定于协议的传输层格式。对于其他类型的套接字,根据选择的传输层协议(例如 TCP、UDP)自动封装有效载荷,并且套接字用户不知道与有效载荷一起广播的协议头的存在。从原始套接字读取时,通常包含标头。
从原始套接字传输数据包时,自动添加标头是可选的。
大多数套接字应用程序编程接口(API),例如基于Berkeley 套接字的那些,支持原始套接字。Windows XP于 2001 年发布,在Winsock接口中实现了原始套接字支持,但三年后,微软出于安全考虑限制了 Winsock 的原始套接字支持。
原始套接字用于与安全相关的应用程序,如Nmap。原始套接字的一个用例是在用户空间中实现新的传输层协议。
原始套接字通常在网络设备中可用,用于路由协议,例如Internet 组管理协议(IGMP) 和开放最短路径优先(OSPF),以及用于Internet 控制消息协议(ICMP) 等事情,由ping 实用程序。
以上内容参考网络-套接字