TCP/IP协议和socket

1、理解TCP/IP协议:

TCP/IP 是因特网的通信协议。TCP/IP 通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信,也就是通信双方进行数据交互的一种约定。

①协议分层:

网络协议分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。 ISO(国际标准化组织),制定了一个国际标准OSI七层协议模型,OSI协议以OSI参考模型为基础界定了每个阶层的协议和每个阶层之间接口相关的标准。

 应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层协议的代表有HTTP。表示层将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。会话层负责建立和断开通信连接以及数据的分割等数据传输相关的管理。

传输层管理两个节点之间的数据传输。网络层地址管理与路由选择, 在这一层,数据的单位称为数据包(packet)。数据链路层互连设备之间传送和识别数据帧(交换机)。物理层以"0"、 "1"代表电压的高低,灯光的闪灭,在这一层,数据的单位称为比特(bit)。

七层通信:发送方由第七层到第一层 由上到下按照顺序传送数据,每个分层在处理上层传递的数据时,附上当前层协议所必须的 "首部"信息。接收方由第一层到第七层 由下到上按照顺序传递数据,每个分层对接收到的数据进行 "首部"与"内容"分离,再转发给上一层。最终将发送的数据恢复为原始数据。

②传输方式分类:

传输协议有TCP (Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)协议。TCP协议提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。而UDP则不为IP提供可靠性、 流控或差错恢复功能。即TCP协议是可靠的、面向连接的协议,传输效率低;UDP协议是不可靠的、无连接的服务,传输效率高。TCP/IP协议与低层的数据链路层和物理层无关。

③三次握手 建立连接:

TCP是面向连接的协议,也就是说在收发数据之前,必须先和对方建立连接。TCP传输起始时,客户端、服务端要完成三次数据交互工作才能建立连接,常称为三次握手

 TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。SYN(SYNchronization) : 在连接建立时用来同步序号。SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

④四次挥手 释放连接:

TCP断开连接时,客户端、服务端要完成四次数据交互工作才能释放连接,常称为四次挥手。FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

 当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。

为什么要等待呢?为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求后 WAIT_TIME会重新记时)

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

2、socket

socket(套接字)指一种在两端(一般是服务器-客户端)之间建立连接、传输数据的一种方式或一种约定(接口)。Socket编程用于解决我们客户端与服务器之间通信的问题。

进程通信的首要问题是如何唯一标识一个进程:通过(ip地址+协议+端口)。使用TCP/IP协议的应用程序通常采用socket来实现网络进程之间的通信。

①socket的基本操作:

socket()函数:用于创建一个唯一标识的socket描述字。bind()函数:服务器需要通过调用bind()函数来绑定一个地址(如ip地址+端口号)使其能够被客户端连接并向客户端提供服务。

listen()、connect()函数:socket()创建的socket默认为主动类型的,listen()将socket变为被动类型的,等待客户的连接请求。客户端通过调用connect()来建立与TCP服务器的连接。

accept()函数:connect()之后客户端向TCP发送了一个连接请求,TCP服务器监听到该请求后调用accept()接收请求,连接建立完成,之后可以进行网络I/O操作,类似文件的读写I/O操作。

recv()/send()函数:若未发生错误,则recv()函数返回收到的字节数,buf指向的缓冲区将包含接收到的数据,如果连接正常关闭,则返回值为0,否则返回SOCKET_ERROR值。若未发生错误,则send()函数将返回发送的总字节数,该字节数可能小于在len参数中请求发送的数量,否则将返回SOCKET_ERROR值。

close()函数:完成读写操作后,使用close()函数关闭socket描述字,对应文件的关闭操作。注意:close操作只是使相应socket描述字的引用次数减1,只有当引用计数器为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

recvfrom()函数:用于接收UDP数据。sendto()函数:用于传输UDP数据。

TCP通信socket编程过程:

UDP通信socket编程过程:

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值