TCP数据传输实现了从一个应用程序到另一个应用

进阶问题:C10K:10000 connectionIO多路复用

socket简介

TCP的上一层是应用层,TCP向应用层提供可靠的面向对象的数据流传输服务,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递。它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信。),应用程序通过向TCP层提交数据接发送/收端的地址和端口号而实现应用层的数据通信。
通过IP的源/目的可以惟一地区分网络中两个设备的连接,通过socket的源/目的可以惟一地区分网络中两个应用程序的连接。
三次握手
TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后进行数据通信,最后拆除连接三个过程。TCP在建立连接时又分三步走:
第一步(A->B):主机A向主机B发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步(B->A):主机B在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示主机B的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步(A->B):主机A也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成
TCP/IP核心协议
三次握手

详细的网络IO模式及流程:

首先让我们通过一张图知道socket在哪里?

UDP
UDP即用户数据报协议,是一种面向无连接的不可靠传输协议,不需要通过3次握手来建立一个连接,同时,一个UDP应用可同时作为应用的客户或服务器方。
由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。UDP比TCP协议更为高效,也能更好地解决实时性的问题,如今,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议。

REST是什么?怎么用? socket

美高梅棋牌官网 1

TCP/IP核心协议
协议选择
协议的选择应该考虑到数据可靠性、应用的实时性和网络的可靠性。
对数据可靠性要求高的应用需选择TCP协议,而对数据的可靠性要求不那么高的应用可选择UDP传送。

美高梅棋牌官网 ,Http请求与tinyHttpd服务器

IP地址分类 C类网络号占三段IP数据报重组:分片发生在路由上 重组在目的主机 数据包首部包含分片信息TCP四次握手:SYN建立连接 FIN关闭连接 ACK响应 PSH有DATA数据传输 RST连接重置 首部报文包含内容 URG=1紧急封包

即时通讯网 做一款个人QQ

Snip20160624_4.png

TCP协议中的3次握手、重传确认等手段可以保证数据传输的可靠性,但使用TCP协议会有较大的时延,因此不适合对实时性要求较高的应用;而UDP协议则有很好的实时性。
网络状况不是很好的情况下需选用TCP协议(如在广域网等情况),网络状况很好的情况下选择UDP协议可以减少网络负荷。

Socket编程

通讯步骤(UDP为主 升级到TCP):①申请socket套接字 skt_fd = socket( AF_INET, SOCK_STREAM, 0);/AF_INET:使用IPV4的协议 SOCK_STREAM:使用tcp通信 0:使用标准协议,返回一个针对网络操作钥匙/②服务端/绑定IP地址结构体和套接字,实现资源初始化/rtv = bind(skt_fd, (struct sockaddr )&skt_addr, sizeof);{/监听:设置网络最大同时通信数量:2*/rtv = listen(skt_fd, 2);

美高梅棋牌官网 2Paste_Image.png

}客户端connect连接 rtv = connect(skt_fd, (struct sockaddr )&skt_addr, sizeof);/skt_addr是IPV4结构体sockaddr_in对象*/

美高梅棋牌官网 3Paste_Image.png1.htonl(INADDR_ANY);//登记本机所有网卡③收rtv = read(clt_fd, buf, sizeof;发rtv=write(skt_fd,buf,sizeof;sendto(skt_fd, buf, sizeof,0,(struct sockaddr *)&clt_addr, &len );recvFrom④关闭close;

一个套接字建立一个连接,connect只用使用一次 客户端/服务端都一样收发函数send字符串转整数函数:atoi()

socket1
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

Socket是一个网络接口,不同的协议之间的差异性操作,则交给socket自行解决
是一种特殊的IO接口,是一种文件描述符;
是一种常用的进程之间的通信,本地,不同主机之间通信;
Socket可用网络地址结构
{协议,本地地址,本地端口}表示

多线程与互斥锁

美高梅棋牌官网 4对返回的skt_fd操作即可.png

tcp和udp的区别
在这里就必须讲一下udp和tcp的区别了

套接字类型:
1.流式套接字SOCK_STREAM
流式的套接字可以提供可靠的、面向连 接的通讯流。它使用了TCP协议。TCP保证了数据传输的正确性和顺序性;

音视频传输

延时 包的大小 图像/视频压缩 内/外网握手

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

  1. 数据报套接字SOCK_DGRAM
    数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议UDP。
  2. 原始套接字SOCK_RAM
    原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议的测试等。
    对底层协议进行访问,不方便,对一些协议开发。

并发处理

1.epoll这种可以支持成千上万tcp并发连接2.udp模拟tcp3.TCP维持多人同时在线是个问题[1], 涉及到服务器数量,系统调优,编程手段等很多方面4.QQ UDP丢包重发机制(缓存MTU设置 头部信息 切包 编号 多线程收发)

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

地址结构:

即时聊天架构

1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。

王者荣耀的网络连接分析1.更新-模仿TCP的UDP协议2.TCP UDP协议的深入了解与实践3.吸收优点 深入底层

路由器的通信流程(每层对应的硬件有哪些)例:QQ->物理层 数据链路层(写网卡驱动 通信协议)会话层:登录 加密算法 应用层:QQ界面程序 表示层:解密路由器 交换机:①网路层(ip协议,路由:数据发送路径[路由协议用来解决何种效率最高])②数

据链路层路由器国内研发主要方向:优化协议 算法 虚拟网卡->软件代替硬件 什么是AP QOS模式,带双

WAN 下载续传

路由表-数据结构,算法算出最高效路径

端口号(0-65535,2个字节,16位二进制,实际从1024开始用,之前有大部分有系统用)

TCP完整通信过程1.创建套接字socket;2.绑定bind;3.监听listen;4.对方主动连接connect-接收连接请求accept;5.使用新的套接字通信send/write-对方revc/read;6.close

点播例子思路:主函数传参 使用线程接收 内核链表封装客户端列表 信息解析函数 转发消

息(先遍历内核链表判断客户端是否存在)-服务器相当于中转站UDP什么情况用? UDP占有系统资源少,可能会丢包TCP是可靠的传输。下载时,telnet时....UDP是不可靠传输。视频,语音聊天....

当你编写的应用软件不想考虑下面的连接是否可靠时用,既认为你发的信息对方一定收到.当软件要求很小的延迟的时候使用UDP,但是必须在你软件中实现双方的确认,即你发信息以后得想个办法确认对方是否收到了你发的信息.这样的好处是降低了网络的延迟.

bind的端就叫发送端,谁先接收谁绑定bind bind自己的IP 两边都绑定

接收端bind后占用解除 sinsize = 1;

作业:udp两边都绑定 两个项目 TCP广播 试题0.发送本地记事本文件给指定客户端

1.tcp发图片给开发板800*480(Ubuntu控制命令控制图片的显示)-不是挂载full-全屏half-缩小一半显示

2.udp广播发送端 绑定地址:192.168.1.255

接收端 不要绑定自己地址 可以绑定255/INADDR_ANY

四类网络地址-通俗讲解A:第一字节网络地址 二三四字节主机地址 0开始B:二 10C:三 110D:

一般不用0和255前三个数第一个不可以是0,其他2个数为0~255任意数,我们就拿最后一个数(也就是Ip二进制后8位

)来说吧,可用的IP地址一般不是以0或255结尾,以0结尾的一般表示网络地址,255结尾的是广播地

址,也就是说我们用的IP地址是1~254结尾之间的,这其中以1或254结尾的地址常常会用作网关地址,

所以我们电脑用的ip后面一般是1253或2254之间的数结尾的。

4.20下午笔记广播 点播 组播 -------区别

我的学习加经验方法:先自己看API敲一些代码-调试-步步改错-再调试-流程测验-参考案例

完善-再测验-记忆-快速使用

软件项目管理经验 做一个网页即时通讯需要了解什么协议

IP:网络层协议;TCP和UDP:传输层协议;HTTP:应用层协议;SOCKET:TCP/IP网络的API。TCP/IP代表传输控制协议/网际协议,指的是一系列协议。TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许

其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就

是像HTTP,文件传输协议FTP这样的协议等。TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的

,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机

制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。HTTP是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协

议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。记住,需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,,使用TCP协议来传

输数据的HTTP是Web服务器和客户端使用的特殊协议。Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络

上的应用程序。

TCP&UDP几种常见IO模型1.TCP并发阻塞IO:多线程实现多进程实现

调试时发现无法连接可换端口试试

关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

struct sockaddr_in
    {
       short int sin_family;  /* Internet地址族 */
       unsigned short int sin_port;  /* 端口号 */
       struct in_addr sin_addr;   /* IP地址 */
       unsigned char sin_zero[8];  /* 填0 */
     };

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

TCP三次握手和四次挥手
相对于SOCKET开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的。因此开发者并不需要控制这个过程。但是对于理解TCP底层运作机制,相当有帮助。

美高梅棋牌官网 5

因此在这里详细解释一下这两个过程。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

TCP三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

   编程中一般并不直接针对sockaddr数据结构操作,而是使用与sockaddr等价的sockaddr_in数据结构

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
tcp3
首先了解一下几个标志,SYN(synchronous),同步标志,ACK (Acknowledgement),即确认标志,seq应该是Sequence Number,序列号的意思,另外还有四次握手的fin,应该是final,表示结束标志。

现在让我们来看一下一个基于TCP/IP的服务器的流程

第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

  1. 创建一个socket,用函数socket()
  2. 绑定IP地址、端口等信息到socket上,用函数bind()
    3.设置允许的最大连接数,用函数listen()
    4.接收客户端上来的连接,用函数accept()
    5.收发数据,用函数send()和recv(),或者read()和write()
    6.关闭网络连接

第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。

基于TCP/IP的客户端
1.创建一个socket,用函数socket()
2.设置要连接的对方的IP地址和端口等属性
3.连接服务器,用函数connect()
4.收发数据,用函数send()和recv(),或者
read()和write()
5.关闭网络连接

第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。

1、socket()
函数的作用:创建一个socket()套接字
函数的头文件:#include <sys/socket.h>
函数的原型:int socket(int domain, int type, int protocol);
函数的参数:
Domain:表示使用何种地址类型
AF_INET:IPV4网络络协议
AF_INET6:IPV6网络协议
Type:SOCK_STREAM,TCP:面向数据流的
SOCK_DGRAM,UDP:使用不连续不可信赖的数据包连接
SOCK_RAW 提供原始网络协议
Protocol:指定传输协议编号,一般设为0即可
函数的返回值:
成功:返回套接字描述符
出错:-1

tcp四次挥手

2、bind()
函数的作用:绑定IP地址
函数的原型:int bind(int sockfd, struct sockaddr * hostaddr, int addrlen)
函数的头文件:#include <sys/types.h>

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket

#include <sys/socket.h>

编程中,任何一方执行close()操作即可产生挥手操作。
tcp4
其实有个问题,为什么连接的时候是三次握手,关闭的时候却是四次挥手?

  • 1

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

美高梅棋牌官网 6

tcpsocket和udpsocket的具体实现
讲了这么久,终于要开始讲socket的具体实现了,iOS提供了Socket网络编程的接口CFSocket,不过这里使用BSD Socket。

  • 1

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:TCP数据传输实现了从一个应用程序到另一个应用

您可能还会对下面的文章感兴趣: