tcp协议

Socket编程中的强制关闭与优雅关闭及相关socket选项

 ̄綄美尐妖づ 提交于 2020-03-15 06:43:54
以下描述主要是针对windows平台下的TCP socket而言。 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议,这里不详细描述了。而关闭socket是指关闭用户应用程序中的socket句柄,释放相关资源。但是当用户关闭socket句柄时会隐含的触发TCP连接的关闭过程。 TCP连接的关闭过程有两种,一种是优雅关闭(graceful close),一种是强制关闭(hard close或abortive close)。所谓优雅关闭是指,如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。而强制关闭是指如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。 下面说一下shutdown及closesocket函数。 shutdown函数的原型是: int shutdown( SOCKET s, int how ); 该函数用于关闭TCP连接,单并不关闭socket句柄。其第二个参数可以取三个值:SD_RECEIVE,SD_SEND,SD_BOTH。 SD_RECEIVE表明关闭接收通道,在该socket上不能再接收数据,如果当前接收缓存中仍有未取出数据或者以后再有数据到达

计算机网络介绍(一)

 ̄綄美尐妖づ 提交于 2020-03-14 15:19:49
分层的网络结构     相互通信的计算机必须高度协调才能够进行通信,仅仅一条线路是不可能的   为了处理这些 复杂的网络 问题,早在最初的阿帕网中,就 提出 了 分层的方法   分层将 庞大复杂的问题 ,转换成 若干个局部较小的问题 ,较小的问题就更加易于研究分析。    比如,唐僧取经,西天路途遥远,如果整体的看待出行问题,势必非常复杂   如果将整条路拆分为多个小段,这一段适合坐船,那一段适合骑马,这样就能够更好地解决问题    通过分层,各层之间相互独立,整体功能进行分解,每层实现独立功能   灵活型好,易于实现和维护, 当一层发生变化,不会影响另一层 ,只要他们之间的 协作接口不变   其实就是软件 开发中的解耦   关于通信协议的分层,有下面三种形式   其实 只有中间的TCP、IP是有用的   OSI理论虽然很完备,但是没有赶上互联网的发展,而且实现过于复杂   TCP/IP协议才是真正使用的协议    TCP/IP层次结构 TCP/IP分层介绍   如上图所示,现有的TCP、IP协议是分层次的。   在分层体系结构中,各层之间是完全独立的,某一层并不需要知道他的下一层是如何实现的,而仅仅是需要知道下层提供的服务   由于每一层都只是实现一种相对独立的功能,因而可以 将一个难以处理的复杂问题分解为若干个小问题。 应用层   应用层是体系结构中的最高层

UDP TCP 消息边界

可紊 提交于 2020-03-14 06:16:05
先明确一个问题,如果定义了一个数据结构,大小是,比方说 32 个字节,然后 UDP 客户端连续向服务端发了两个包。现在假设这两个包都已经到达了服务器,那么服务端调用 recvfrom 来接收数据,并且缓冲区开得远大于 64,例如,开了 1024 个字节,那么,服务端的 recvfrom 函数是会一次收到两个数据包呢,还是只能收到一个。 答案是只能收到一个。 来看代码: struct.h #ifndef STRUCT_H #define STRUCT_H typedef struct _UDP_MSG { int add1; int add2; int sum; char str1[16]; char str2[16]; char cat[32]; } UDP_MSG; #endif /* STRUCT_H */ 服务器的代码: #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include "struct.h" #define MAX_LINE 1024 #define SERV_PORT 8080 int udp_serv();

长连接和短链接的区别

折月煮酒 提交于 2020-03-14 03:29:09
TCP/IP TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议 UDP包括DNS、TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 什么时候用长连接,短连接? 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开

linux-7week

坚强是说给别人听的谎言 提交于 2020-03-14 00:37:35
1、osi七层模型和TCP/IP五层模型 应用层:为应用软件提供服务。 表示层;用于处理两个通信系统中交换信息的表示方式,主要有数据格式交换,数据加密数据解秘,数据压缩等。 会话层:维护两个计算机之间的传输链接,保证点到点传输不中断,以及管理数据交换等。 传输层:确保数据传输的可靠性,通过端口号来区分上层应用程序;传输的是数据段 --TCP UDP 网路层:数据传输, 数据包,逻辑地址/IP地址 --路由器 ;协议-IP ICMP IGMP ARP RARP 数据链路层:数据帧、MAC地址/物理地址, --交换机 物理层:二进制数据传输,比特流;--网卡 2、总结描述TCP三次握手四次挥手 TCP的三次握手: 在A机向B机发送数据交互时,建立SYN数据连接请求 ,数据包seq=x,发送给B机当B机收到数据后会回复给A机,同样也会发送SYN数据建立报文,B机给A机的数据包为seq=y,同样也要回复给A机的确认报文ACK=x+1,表明此数据我以收到,当A机再次收到B机确认的数据后,回复确认报文ACK=y+1,同样也会封装自己的数据包x+1告诉B机可以进行数据交互。 TCP的四次断开: 在A机向B机请求断开连接时,会发送FIN断开连接请求,封装一个数据包seq=x,发送给B,当B机收到A记得断开请求数据时,同样也会回复给A机ack确认报文数据包会表示为seq=x+1

linux-7week

末鹿安然 提交于 2020-03-14 00:32:45
1、osi七层模型和TCP/IP五层模型 应用层:为应用软件提供服务。 表示层;用于处理两个通信系统中交换信息的表示方式,主要有数据格式交换,数据加密数据解秘,数据压缩等。 会话层:维护两个计算机之间的传输链接,保证点到点传输不中断,以及管理数据交换等。 传输层:确保数据传输的可靠性,通过端口号来区分上层应用程序;传输的是数据段 --TCP UDP 网路层:数据传输, 数据包,逻辑地址/IP地址 --路由器 ;协议-IP ICMP IGMP ARP RARP 数据链路层:数据帧、MAC地址/物理地址, --交换机 物理层:二进制数据传输,比特流;--网卡 2、总结描述TCP三次握手四次挥手 TCP的三次握手: 在A机向B机发送数据交互时,建立SYN数据连接请求 ,数据包seq=x,发送给B机当B机收到数据后会回复给A机,同样也会发送SYN数据建立报文,B机给A机的数据包为seq=y,同样也要回复给A机的确认报文ACK=x+1,表明此数据我以收到,当A机再次收到B机确认的数据后,回复确认报文ACK=y+1,同样也会封装自己的数据包x+1告诉B机可以进行数据交互。 TCP的四次断开: 在A机向B机请求断开连接时,会发送FIN断开连接请求,封装一个数据包seq=x,发送给B,当B机收到A记得断开请求数据时,同样也会回复给A机ack确认报文数据包会表示为seq=x+1

tcp协议

情到浓时终转凉″ 提交于 2020-03-13 00:51:55
TCP(Transmission Control Protocol 传输控制协议 )是一种面向连接的、可靠的、基于字节流的 传输层 通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 [1] 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( [1] MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 [1] 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延( RTT )内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 [1] 来源: https://www.cnblogs

如何判断TCP包是否发送成功

浪子不回头ぞ 提交于 2020-03-12 17:13:05
1. TCP发送接口:send()   TCP发送数据的接口有send,write,sendmsg。在系统内核中这些函数有一个统一的入口,即sock_sendmsg()。由于TCP是可靠传输,所以对TCP的发送接口很容易产生误解,比如sn = send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。 我们知道,TCP的发送和接收在在内核(linux)中是有对应的缓冲的: struct sock{ ... struct sk_buff_head receive_queue; //接收的数据报队列 struct sk_buff_head write_queue; //即将发送的数据报队列 ... }   对于发送端而言,用户空间调用send(data)等发送接口将数据发送, 内核会将data拷贝到内核空间的socket对应的缓冲中,即sock.write_queue。而send()函数的返回值仅仅是表示本次send()调用中成功拷贝的字节数(用户空间->内核空间对应的sock缓冲队列) 。 具体发送和接收端的接收就由TCP协议完成 ,虽然TCP是可靠传输,但是这个前提是发送端和接收端的网络是连接的,否则你懂得。这样,对于调用send()发送的用户而言,如果想要确定接收方是否成功接受数据,就得需要靠其他的办法查询。 2. send(

TCP UDP面试题

早过忘川 提交于 2020-03-12 13:42:35
1.TCP/IP四层模型 # 1.网络接口层(物理层,数据链路层) # 2.网络层 # 3.传输层 # 4.应用层(会话层,表示层,应用层) 2.TCP与UDP区别 # TCP:面向连接,可靠的,速度慢,效率低 # UDP:无连接,不可靠,速度快,效率低 3.TCP/UDP应用 # TCP对通信质量有要求的,例如HTTP,HTTPS协议 # UDP不需要一对一沟通,建立连接的,可以做到一对多,如广播,直播需要处理速度快的,能容忍丢包的 4.三次握手四次挥手 # 三次握手# 1.客户端发送一个带SYN标志的TCP报文到服务器端,并进入SYN_SEND状态,等待服务端确认 # 2.服务端收到客户端的报文并返回一个同时带ACK标志和SYN报纸的报文,进入SYN_RECV状态。表示确认刚才客户端的报文,同时询问客户端是否准备好通讯 # 3.客户端再次回应服务端一个ACK报文,双方进入ESTABILISHED状态 # 四次挥手 # 1.TCP客户端发送一个FIN,用来关闭客户端到服务端的数据传送 # 2.服务端收到这个FIN,它发挥一个ACK,确认序号为收到的序号加一 # 3.服务端关闭客户端的连接,发送一个FIN给客户端 # 4.客户端发回ACK报文确认,并将确认序号设置为收到序号加一 5.为什么连接的时候是三次握手,关闭的时候是四次挥手? # 因为服务端收到客户端的SYN连接请求报文后

网络7层架构+TCP/IP原理

怎甘沉沦 提交于 2020-03-12 08:23:40
7 层模型主要包括: 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率 等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为 1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。 2. 数据链路层:主要将从物理层接收的数据进行 MAC 地址(网卡的地址)的封装与解封装。常把这 一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。 3. 网络层:主要将从下层接收到的数据进行 IP 地址(例 192.168.0.1)的封装与解封装。在这一层工 作的设备是路由器,常把这一层的数据叫做数据包。 4. 传输层:定义了一些传输数据的协议和端口号(WWW 端口 80 等),如:TCP(传输控制协议, 传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议, 与 TCP 特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如 QQ 聊天数据就是通过这 种方式传输的)。 主要是将从下层接收的数据进行分段进行传输,到达目的地址后在进行重组。 常常把这一层数据叫做段。 5. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间 发起会话或或者接受会话请求(设备之间需要互相认识可以是 IP 也可以是 MAC 或者是主机名) 6