본문 바로가기
프로토콜

프로토콜 스택과 TCP, UDP

by 흰색남자 2022. 10. 13.

데이터 통신에 활용되는 프로토콜의 구조에 관한 개념으로, 계층화된 구조(스택 구조)로 모여 있는 프로토콜의 집합

osi 7계층의 각 계층의 프로토콜을 쌓아서 만든 것을 프로토콜 스택이라함

 

 

 

 
먼저 소켓을 생성하게 되고 연결을 위한 3 Way Handshake를 진행한 뒤에 데이터를 송신, 수신하고
다 마친 뒤에는 연결 끊기를 위한 4 Way Handshake를 진행
 
주로 사용되는 TCP 헤더
SYN : 송신측과 수신측에서 시퀀스 번호를 공유함
ACK : 수신 데이터의 시퀀스 번호와 유효함을 나타냄
FIN : 연결 끊기를 나타냄
시퀀스 번호 :  현재 데이터의 첫 번째 위치가 전체 송신 데이터에 몇 번째 인지를 나타내는 일련 번호
ACK 번호 : 수신측에 몇 바이트까지 받았는지 송신측으로 보내는 일련의 번호
클라이언트 : 소켓을 생성  > 브라우저에서 소켓을 호출
이때 도메인과 사용할 타입인 TCP를 설정을 해서 호출하게 되는데  OS의 네트워크 제어용 소프트웨어라고 할 수 있는
프로토콜 스택이 이를 받아서 소켓을 작성하게 되고 디스크립터를 반환
디스크립터 : 소켓의 번호표
그 다음으로는 3 Way Handshake를 진행
브라우저에서 아까 받았던 디스크립터와 요청을 보낸 서버 IP 주소, 그리고 포트 번호를 넣어서 호출
> 프로토콜 스택이 요청을 받아서 웹 서버로 요청을 보냄
3 Way Handshake 과정
첫 번째로 클라이언트에서 시퀀스 번호를 초기화
초기화 한 번호를 공유하기 위해서 컨트롤 비트 SYN을 설정을 해서 서버로 보냄
이 SYN은 시퀀스 번호를 공유함을 나타내는 컨트롤 비트임
마찬가지로 서버에서 시퀀스 번호를 초기화를 해서 서버에서 생성한 시퀀스 번호를 공유하게 되고
아까 클라이언트으로부터 받았던 시퀀스 번호가 잘 도착했다는 것을 알리기 위해서
ACK 번호를 설정을 해서 클라이언트로 데이터를 보냄
다음으로 서버에서 시퀀스 번호를 잘 받았다는 걸 서버에 알려주기 위해서 ACK 번호를 설정을 해서 서버로 데이터를 보냄
일련의 과정을 거치게 되면 서버와 클라이언트는 연결을 맺음
 
시퀀스 넘버와 아크 넘버가 난수로 설정됨
이렇게 난수로 생성된 이유는 포트는 유한하기 때문에 같은 포트가 사용될 가능성이 있음
그래서 서버와 클라이언트가 각각 같은 포트를 사용하게 되면은 서버에서는 패킷을 구분하기 위해서 시퀀스 넘버를 통해서 구분함
그런데 순차적인 시퀀스 넘버를 사용하게 되면은 이전 커넥션으로부터 온 패킷으로 인지를 할 가능성이 있기 때문에 서버에서 인지할 수 있도록 난수를 생성을 해서 패킷을 보냄
 

 

클라이언트에서 write를 호출하게 되고 브라우저에서 받은 Http request 메시지를 받아서 패킷으로 만들어 서버에 전달
이걸 받은 서버는 응답을 하기 위해서 데이터를 만들고 패킷을 만들어서 클라이언트에 보내게 되면 클라이언트는 read를 호출해서 데이터를 읽음

 

만약 중간에 패킷이 이렇게 소실되게 되면은 클라이언트는 서버로부터 일정 시간 동안 응답이 오지 않으면 이전 패킷을 다시 재전송해서 요청
이랬는데도 요청에 응답이 오지 않는다면 클라이언트에서는 데이터 송신작업을 강제로 종료하고 어플리케이션에 오류를 반환함

 

4 way handshake입니다
클라이언트에서는 close를 호출하게 되면 TCP 헤더에 연결 끊기를 나타내는 컨트롤 비트, FIN을 설정을 해서 서버로 보내주게 되고 서버는 이 FIN에 대한 응답으로 ACK를 설정을 해서 응답하고 클라이언트는 서버로부터 FIN 응답이 올 때까지 기다리는 상태가 됨
다음으로 서버에서 보낼 데이터가 없다면 바로 close를 호출을 해서 마찬가지로 컨트롤 비트, FIN을 설정을 해서 클라이언트로 보냄

 

마지막으로 클라이언트에서는 잘 받았다는 의미로 ACK번호를 설정을 해서 서버로 전송을 하게 되면 클라이언트의 소켓이 말소되고 연결이 끊기게 됩니다
소켓이 말소될 때는 바로 말소되는 게 아니라 일정 시간 뒤에 말소가 되는데 그 이유는 서버가 ACK 패킷을 받지 못했을 경우에 다시 재요청을 할 수 있기 때문에 일정 시간 뒤에 소켓을 말소하게 됩니다
 
 
 
UDP 동작 과정
TCP와 동일하게 소켓을 호출하게 되는데 이때 도메인과 사용할 타입인 UDP를 설정을 해서 호출
프로토콜 스택에 소켓을 작성하게 되고 디스크립터를 반환
UDP 동작 과정은 sendto를 호출하고 브라우저로부터 받은 Http 메시지를 넣어서 패킷으로 만들어 서버로 전송을 하게 됨
서버에서는 응답을 하기 위해서 sendto를 호출하게 되고 이때 패킷이 소실되게 되더라도 다음 데이터를 바로 전송
클라이언트는 이걸 신경 쓰지 않고 recvfrom을 호출해서 데이터를 5bytes 받게 됩니다
 
 

TCP 같은 경우는 패킷의 손실을 방지하고 패킷의 순서를 보장하기 위해서 ACK 번호와 시퀀스 번호를 사용을 해서

신뢰성이 높고 상대적으로 UDP는 이런 것들을 사용하지 않기 때문에 신뢰성이 낮다고 볼 수 있습니다

 

전송 속도는 TCP는 handshake를 하기 때문에 상대적으로 느리고 UDP는 사용하지 않기 때문에 상대적으로 빠르다고 볼 수 있습니다
TCP가 사용되는 곳은 HTTP2.0버전 이하의 대부분에서 사용이 되고 UDP같은 경우는 DNS 서버와 통신할 때 사용됩니다
DNS 서버와 통신할 때 사용될 수 있는 이유는 하나의 패킷에 요청, 응답 값이 담길 수 있기 때문에 중간에 패킷이 소실되더라도 한 번 더 요청을 보내기 때문에 UDP를 사용함. 그리고 하나의 패키지이기 때문에 순서가 보장될 필요가 없어서 UDP를 사용하게 됩니다
동영상, 음성 데이터 같은 실시간 데이터들은 신뢰성보다는 속도가 중요하기 때문에 일정 시간이 지난 데이터들은 의미가 없어집니다
그래서 상대적으로 속도가 빠른 UDP를 사용을 해서 데이터를 주고받게 됩니다

'프로토콜' 카테고리의 다른 글

DBCP - database connection poll  (0) 2022.12.25
REST API 한줄 요약  (0) 2022.09.28