네트워크 애플리케이션
서로 다른 end system애소 동작하는 것을 목표로 한다.
network core장비는 애클리케이션을 동작시키지 않음
서버
항상 호스트에 존재함
고정Ip를 가지고 있음
클라이언트
서버와 통신함
간헐적으로 연결됨
가변IP를 가짐
클라이언트끼리 직접통신하지 않음
peer to peer
서버에 의존하지 않음
end system끼리 직접 통신
peers는 다른 peers로 부터 서비스를 요청하고, 다른 peers에게 답례로 섭스를 제공함(토렌트와 유사)
서로 간헐적 연결, IP주소 교환
프로세스
호스트내에서 동작하는 프로그램
client process통신을 초기화하는 프로세스
server프로세스 접속을 기다리는 프로세스
p2p는 둘 다 가짐
Sockets 프로세스는 소켓으로 메시지을 송수신함
송신하는 쪽, 수신하는 쪽 모두 소켓을 가지고 있음
프로세스는 앱 개발자에 의해 제어됨
전송계층 부터는 os의해 제어
프로세스 주소 배정
메시지를 주고받기 위해서는 프로세스가 주소를 가지고 있어야함
IP주소와 포트넘버 2가지를 사용함
IP주소만 사용할 경우 한 호스트 내 여러 프로세스가 있을 경우 문제가 생김
애플리케이션이 이용 가능한 transport서비스
데이터 무결성 신뢰성 있는 데이터 전송, 파일 전송 등
시간 일부 서비스는 저지연을 필요로함, 스트리밍 등
처리율 서비스를 이용하기 위한 최소한의 처리율
보안
TCP
송신과 수신 프로세스 사이에 있는 신뢰성 있는 전송
흐름제어 송신호스트의 전송송도 조절
혼잡제어
연결지향 클라이언트, 서버 프로세스간 전송제어정보를 교환함
시간,최소처리율, 보안 지원 안함
이메일, 파일전송 등
UDP
송수신 프로세스바이의 신뢰성 없는 전송
신뢰성, 흐름제어, 호잡제어 , 시간, 처리율, 보안 등 지원안함
신뢰성이 크게 중요하지 않은 경우 사용
인터넷 전화 등
TCP, UDP는 암호화하는 과정이 없음
전송계층의 TLS을 사용하여 암호화된 TCP를 사용 가능
데이터무결성 가능, 인증절차 가능
소켓 주소
AF_UNIX 하나의 호스트 내부 통신
사용하는 주소는 파일 시스템 경로명을 기반으로 함
AF_INET 인터넷(서로 다른 호스트) 통신
Ip주소와 포트번호를 조합하여 소켓주소를 표현함
통합주소체계
소켓 주소가 표현방식이 다른 구조체에서 사용되기 위해 일반 구조체 하나로 정의할 필요가 있음
구조체로 형변환하여 문법의 통일성을 유지함
htonl 일반 pc에서 네트워크로 내보내기 위해 형변환
빅엔디안
큰 단위부터 메모리에 적는 방식
헤더를 사용하기 편해 네트워크에서 많이 사용
리틀엔디안
작은단위부터 메모리에 적음
일반 pc에서 많이씀
연산 빠름
소켓서비스 유형
SOCK_STREAM
인터넷에서 TCP에 대응
SOCK_DGRAM
인터넷에서 UDP에 대응
소켓 기본 함수
socket()
데이터를 전송하는 소켓을 생성할 떄 호출하는 함수
성공적으로 생성하면 소켓 디스럽터를 반환함
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol); // 이런 식으로 도메인, 타입을 넣는다
//예시
sd = socket(AF_UNIX, SOCK_STREAM, 0); //유닉스 주소체계 TCP서비스
sd = socket(AF_INET, SOCK_DGRAM, 0); // 인터넷 주소체계 UDP 서비스
bind()
socket()함수를 생성하면 디스트럽터가 반환됨, 이 디스트럽터를 통해 상대와 통신하려면 먼저 생성된 주소를 부여해야함
이때 bind()가 소켓에 주소를 부여함
이후 connect, accept을 연결할 . 때소켓주소를 사용
즉 통신을 위한 주소를 부여하는 함수다
int bind(int s, const struct sockaddr *name, socklen_t *namelen);
// s는 sock로부터 나온 소켓 디스트림터 번호, name은 바인딩할 소켓 주소, namelen은 주소의 크기
htonl()
htons()
데이터 송신 시 개별 컴퓨터 바이트 순서를 네트워크 바이트 순서로 변환
ntohl()
ntohs()
데이터 수신 시 네트워크 바이트 순서를 개별 컴퓨터 바이트 수너로 변환
unit32_t htonl(unit32_t hostlong);
unut16_t htons(unit16_t hostshort);
// 개별 컴퓨터를 네트워크로
unint32_t ntohl(unit32_t, netlong);
unut16_t ntohs(unit16_tm netshort);
listen()
서버 프로세스에서 실행
클라이언트의 요청을 듣는 역할
보통 연결형 서비스에만 쓴다
int listen(int s, int backlog);
// s는 연결 요청 개수, backlog는 보통 5를 씀
accept()
연결형 서비스를 지원하는 서버가 클라이언트 요청을 받으려면 accept()에서 대기해야함
클라이언트의 connect() 요청이 발생 시 연결이 설정됨
연결요청 발생 . 시연결이 설정됨, addr에 클라이넡으 주소 반환, 어느 클라이언트가 요청했는지 . 알 수 있음
int accept(int s, struct sockaddr *addr, socklen_t * addrlen);
이 때 기존 socket함수로 생긴 소켓과 별도의 소켓이 생성됨.(기존은 연결 요청을 받는 목적으로만 사용)
새로 생긴 socket의 디스크립터는 accept()함수의 반환값으로 설정
connect()
클라이언트가 서버에 요청할 때 사용함
int connect(int s, const struct sockaddr * name, socklen_t namelen);
//요청을 원하는 서버 프로세스의 소켓주소를 표기한다
클라이언트의 주소
클라이언트는 자신의 주소를 알필요가 없으므로 bind()를 통한 주소를 생성하지 않는다
서버 주소를 사용한 임의 주소를 사용한다.
send()
connect()를 통해 소켓 연결까지 되면 send()를 통해 데이터 전송을 함
send() 연결형에서 사용
sendto() 비연결형에서 사용
ssize_t send(int s, const void *msg, size_t, int flags);
ssize_t sendto(int s, const void *msg, size_t len, ubt flags,
const struct sockaddr *to, socklen_t tolen);
//tcp는 연결형이므로 주소 필요 없음
//UDP는 매번 주소설정 필요
flags는 정상적으로 전송하면 0
recv() 연결형
recvfrom() 비연결형
ssize_t recv(int s, void *bufm size_t len, int flags);
//연결형, 주소설정 없음
//읽은 데이터는 buf에 저장
ssize_t recv(int s, void *bufm size_t len, int flags,
struct sockaddr * from, socklen_t * formlen);
//비연결형 주소설정 있음
//읽은데이터는 buf에 저장
클라이언트와 서버의 동작
1. 서버는 다수의 클라이언트에 공개되는 자신의 소켓주소를 설정 후 클라이언트 연결 대기
2. 클라이언트의 요구에 따른 연결 설정, 제공서비스 시작
3. 여러 클라이언트에 의해 반복적으로 이루어짐
연결형 서비스의 동작
서버
socket소켓생성
bind 주소정보를 소켓에 전달
listen. 클라이언트 대기큐 지정
accept 연결요청 대기
send/recv 데이터 송수신
close
클라이언트
socket 소켓생성
connect 서버에 연결요청
send/recv 데이터 송수신
close 소켓 닫음
비연결형 서비스의 동작
연결형애서 listen, connect, addept가 없다
'네트워크' 카테고리의 다른 글
네트워크 6. (1) | 2024.04.18 |
---|---|
네트워크 5. 전송 계층 (0) | 2024.04.16 |
컴퓨터네트워크 4. DNS, P2P,CDN (0) | 2024.04.15 |
컴퓨터 네트워크 3. 애플리케이션 계층 (1) | 2024.04.15 |
컴퓨터네트워크 1. 기초 (0) | 2024.04.14 |