본문 바로가기
개발 관련 강의 정리/10분 테코톡

[10분 테코톡] 칙촉의 TCP/UDP 정리

by 코딩개발 2023. 6. 5.
728x90
반응형

TCP/IP 모델

Application Layer HTTP, 브라우저
Transport Layer TCP/UDP
Internet Layer IP
Network Access Layer 인터넷

 

TCP 동작 과정

소켓 생성 → 3 Way Handshake → 데이터 송신, 수신 → 4 Way Handshake

 

TCP 헤더

컨트롤 비트  
SYN
ACK
FIN
송신측과 수신측에서 시퀀스 번호를 공유함을 나타냄
수신 데이터의 시퀀스 번호가 유효함
연결 끊기를 나타냄
시퀀스 번호 현재 데이터의 첫 번째 위치가 전체 송신 데이터에 몇 번째 인지를 나타내는 일련번호
ACK 번호 수신측에 몇 바이트 까지 받았는지 송신측으로 보내는 일련번호

 

소켓 생성

 

소켓을 생성의 경우 브라우저에서 소켓을 호출을 한다. 이때 도메인과 사용할 타입인 TCP를 설정을 해서 호출하게 되는데  OS의 네트워크 제어용 소프트웨어라고 할 수 있는 프로토콜 스택이 이를 받아서 소켓을 작성하게 되고 디스크립터를 반환하게 된다. 디스크립터는 소켓의 번호표라고 보면 된다.

 

 

3 Way Handshake

 

3 Way Handshake는 브라우저에서 위에서 받았던 디스크립터와 요청을 보낸 서버 IP 주소, 그리고 포트 번호를 넣어서 호출하게 된다. 그렇게 되면 프로토콜 스택이 요청을 받아 웹 서버로 요청을 보내게 된다.

 


자세하게 3 Way Handshake 과정을 알아보자면 첫 번째로 클라이언트에서 시퀀스 번호를 초기화하게 된다. 초기화 한 번호를 공유하기 위해서 컨트롤 비트 SYN을 설정을 해서 서버로 보내주게 된다. 이 SYN은 시퀀스 번호를 공유함을 나타내는 컨트롤 비트이다.

 

 

마찬가지로 서버에서 시퀀스 번호를 초기화 해서 서버에서 생성한 시퀀스 번호를 공유하게 되고 클라이언트으로부터 받았던 시퀀스 번호가 잘 도착했다는 것을 알리기 위해 ACK 번호를 설정해서 클라이언트로 데이터를 보내게 된다.

 


다음으로 서버에서 시퀀스 번호를 잘 받았다는 것을 서버에 알려주기 위해 ACK 번호를 설정해서 서버로 데이터를 보내게 된다. 일련의 과정을 거치게 되면 서버와 클라이언트는 연결을 맺게된다.

 


와이어셔크를 사용을 해서 3 Way Handshake를 할 때 어떤 패킷들이 주고받아지는지를 살펴보면 먼저 순차적으로 SYN으로 설정된 패킷, 그리고 SYN, ACK로 설정된 패킷, ACK로 설정된 패킷을 볼 수 있다. 그 아래 보면 시퀀스 넘버와 아크 넘버가 난수로 설정되어 있는 것을 볼 수 있다. 난수로 생성된 이유는 포트는 유한하기 때문에 같은 포트가 사용될 가능성이 있다. 그래서 서버와 클라이언트가 각각 같은 포트를 사용하게 되면 서버에서는 패킷을 구분하기 위해 시퀀스 넘버를 통해서 구분하게 된다. 그런데 순차적인 시퀀스 넘버를 사용하게 되면 이전 커넥션으로부터 온 패킷으로 인지할 가능성이 있기 때문에 서버에서 인지할 수 있도록 난수를 생성해서 패킷을 보내주게 된다.

 

 

데이터 송신, 수신


클라이언트에서 write를 호출하게 되고 브라우저에서 받은 Http request 메시지를 받아서 패킷으로 만들어 서버에 전달한다.

 

 

이것을 받은 서버는 응답하기 위해 데이터를 만들고 패킷을 만들어서 클라이언트에 보내게 되면 클라이언트는 read를 호출해 데이터를 읽게 된다.

 

 

패킷 소실되는 경우


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

 


데이터 송수신에서 주고 받아지는 패킷을 살펴보면 TCP Segment Length가 있다. 세그먼트같은 경우는 TCP 헤더와 데이터를 나타낸다. 그래서 보낸 데이터가 557bytes라는 걸 의미하게 되고 수신 측에서는 받았다는 의미로 ACK 번호를 558로 설정되어있다. 그런데 보내는 데이터는 557인데 받은 데이터는 558로 설정이 되어있을까?
그 이유는 3 Handshake 과정에서 이미 한번 시퀀스 번호를 주고 받았기 때문에 + 1 이 되어서 558이 설정된 것이다.

 

 

4 way handshake


클라이언트에서 close를 호출하게 되면 TCP 헤더에 연결 끊기를 나타내는 컨트롤 비트, FIN을 설정해서 서버로 보내주게 되고

 

 

서버는 이 FIN에 대한 응답으로 ACK를 설정을 해서 응답하게 된다. 클라이언트는 서버로부터 FIN 응답이 올 때까지 기다리는 상태가 된다.

 


다음으로 서버에서 보낼 데이터가 없다면 바로 close를 호출해서 컨트롤 비트, FIN을 설정하여 클라이언트로 보내게 된다.

 


마지막으로 클라이언트에서는 잘 받았다는 의미로 ACK번호를 설정해서 서버로 전송하게 되면 클라이언트의 소켓이 말소되고 연결이 끊기게 된다. 소켓이 말소될 때는 바로 말소되는 것이 아니라 일정 시간 뒤에 말소 되는데 그 이유는 서버가  ACK 패킷을 받지 못했을 경우 다시 재요청을 할 수 있기 때문에 일정 시간 뒤에 소켓을 말소하게 된다.

 


위는 4 way handshake에서 주고받아지는 패킷들이다.

 


UDP 동작 과정


TCP와 동일하게 소켓을 호출하게 되는데 이때 도메인과 사용할 타입인 UDP를 설정해서 호출하게 된다. 프로토콜 스택에 소켓을 작성하게 되고 디스크립터를 반환하게 된다.

 


UDP 동작 과정은 sendto를 호출하고 브라우저로부터 받은 Http 메시지를 넣어서 패킷으로 만들어 서버로 전송하게 된다.

 


서버에서는 응답하기 위해 sendto를 호출하고, 이때 패킷이 소실 되더라도 다음 데이터를 바로 전송한다. 클라이언트는 이것을 신경 쓰지 않고 recvfrom을 호출해서 데이터를 5bytes 받게 된다.

 


위는 UDP 동작과정에서 주고 받아지는 패킷들인데 TCP와 비교했을 때 handshake 과정이 없고 아래 보면 UDP 헤더 부분이 굉장히 단순한 것을 알 수 있다. 포트와 데이터의 길이, 데이터의 무결성을 체크하는 체크섬 그리고 데이터로 이루어진 것을 볼 수 있다.

 

 

정리

  TCP UDP
신뢰성 높음 낮음
전송속도 느림 빠름
사용되는 곳 HTTP2.0이하의 버전 대부분에서 사용 DNS, 동영상, 음성 데이터

참고

https://www.youtube.com/watch?v=ad4AO1shXsY&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC 

728x90
반응형

댓글