[Network] 4. TCP기반 서버/클라이언트 1
이 글은 윤성우의 열혈 TCP/IP 책을 참고하여 정리하였습니다. 정확한 내용은 도서를 구매해서 참고하시기 바랍니다.
TCP/IP 프로토콜 스택
인터넷 기반의 데이터 송수신을 목적으로 설계된 스택
7 계층으로 세분화가 되며, 4계층으로 표현된다.
Link 계층
물리적인 영역의 표준화 결과
→ LAN, WAN, MAN과 같은 물리적 표준 관련 프로토콜이 정의된 영역이다.
IP 계층
IP는 Internet Protocol 을 의미함.
경로의 설정과 관련이 있는 프로토콜
TCP/UDP 계층
실제 데이터의 송수신과 관련 있는 계층으로 수송 (Transport) 계층이라고도 함.
TCP는 데이터의 전송을 보장하는 프로토콜, UDP는 보장하지 않는 프로토콜이다.
TCP → 데이터의 전송을 보장 ( 신뢰성이 있음 ) ⇒ UDP에 비해 복잡함
UDP → 보장 전달 X
APPLICATION 계층
프로그래머에 의해서 완성이 된다.
응용 프로그램의 프로토콜을 구성한다.
소켓을 기반으로 완성하는 프로토콜을 의미하며, 소켓 생성시 앞의 계층에 대한 내용은 감추어진다.
TCP 기반 서버, 클라이언트의 구현
TCP 서버
socket () → bind () → listen() → accept() → read() / write() → close() 의 순서로 구현한다.
- socket()
#include <sys/socket.h>
int listen(int sock, int backlog);
연결 요청 대기 상태로 변하게 하는 함수이다. 이때, 연결 요청도 일종의 데이터 전송이라 소켓을 만들어야한다. 이 소켓을 우리는 리스닝 소켓이라고 한다.
- accept()
#include <sys/socket.h>
int accept(int sock, struct * sockaddr, socklen_t * addrlen);
클라이언트의 연결 요청을 수락할 때 사용한다. (connect 를 accept 한다는 의미)
연결 요청 정보를 참고해 새로운 소켓을 하나 더 생성한다.
TCP 클라이언트
socket() → connect() → read() / write() → close()
- connect
int connect (int sock, const struct sockaddr*servaddr, socklent_t addrlen);
connect과정은 서버가 listen 상태로 넘어갔을 때만 가능하다.
Iterative 기반의 서버, 클라이언트의 구현
accept를 반복 호출하면 클라이언트의 연결 요청을 계속 받을 수 있다.
→ 그러나 이것도 한 번에 하나씩 밖에 요청을 받지 못한다.
그래서 while 문을 이용해 반복을 돌려주어 iterative 기반의 서버를 구현할 수 있다.
while(1){
accept()
...
read / write
...
close()
}
TCP로 통신할 때 주의할 점은 TCP는 데이터 경계가 존재하지 않기 때문에, 서버가 문자열을 보낸만큼 잘 받았는지 알 수 없기에 확인이 필요하다.
그에 대한 해결 책은 다음 글에서 설명하겠다.
'Computer Science > Network' 카테고리의 다른 글
[Network] 7. 소켓의 우아한 종료 (0) | 2023.05.28 |
---|---|
[Network] 6. UDP 기반 서버/클라이언트 (0) | 2023.05.28 |
[Network] 5. TCP 기반 서버/클라이언트 2 (0) | 2023.05.28 |
[Network] 3. 소켓에 할당되는 IP 주소와 PORT 번호 (0) | 2023.05.18 |
[Network] 2. 소켓의 타입과 프로토콜의 설정 (0) | 2023.05.18 |