프로그래밍 기초 공부
TCP, UDP란?
alclssha
2022. 11. 6. 11:50
29번째로 포스팅하게 된 내용은 TCP와 UDP에 대한 내용입니다.
[ TCP ]
- TCP는 Trasmission Control Protocol의 약자
- 연결 지향적 프로토콜
- 클라이언트가 연결 요청을 하고, 서버가 연결을 수락하면 통신 선로가 고정되고, 모든 데이터는 고정된 통신 선로를 통해서 순차적으로 전달
- TCP 프로토콜은 신뢰성 있는 데이터의 전송을 위해 확인작업을 거치는데 TCP는 패킷을 성공적으로 전송하면 ACK 라는 신호를 날리고 만약에 ACK 신호가 제 시간에 도착하지 않으면 Timeout이 발생하여 패킷 손실이 발생한 패킷을 다시 전송해줌
- 주로 lient와 Server 또는 P2P Socket 통신 등, 네트워크를 사용한 통신을 할 때 TCP 통신을 많이 사용
[ TCP특징 ]
- 연결형 서비스로 연결이 성공해야 통신이 가능
- 데이터의 경계를 구분하지 않음
- 데이터의 전송 순서를 보장 (데이터의 순서 유지를 위해 각 바이트마다 번호를 부여)
- 신뢰성있는 데이터를 전송 (Sequence Number, Ack Number를 통한 신뢰성 보장)
- 데이터 흐름 제어(수신자 버퍼 오버플로우 방지) 및 혼잡 제어(패킷 수가 과도하게 증가하는 현상 방지)
- 연결의 설정(3-way handshaking)과 해제(4-way handshaking)
- 전이중, 점대점 서비스
- UDP보다 전송속도가 느림
[ 3-way-handshake ]
- TCP 통신을 위한 네트워크 연결은 3 way handshake 이라는 방식으로 연결됨
- 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결이 되는 것을 말함
- 이 과정에서 가장 많은 시간이 소요되어 UDP방식보다 속도가 느려지는 주요 원인으로 지목
[ TCP연결 과정 ]
- Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보냄
- Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경
- 그리고 요청을 정상적으로 받았다는 대답(ACK)와 Client도 포트를 열어달라는 SYN 을 같이 보냄
- Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 ACK 를 전송
- ACK를 받은 서버는 상태가 ESTABLSHED로 변경
[ TCP 상태 ]
- LISTEN : 서버의 데몬이 떠서 접속 요청을 기다리는 상태
- SYN-SENT : 로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태
- SYN_RECEIVED : 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태
- ESTABLISHED : 3 way-handshaking 이 완료된 후 서로 연결된 상태
- FIN-WAIT1, CLOSE-WAIT, FIN-WAIT2 : 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태
- TIME-WAIT : 연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어두고 있는 상태
- CLOSING : 흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태
- CLOSED : 완전히 종료
[ TCP단점 ]
- 데이터로 보내기 전에 반드시 연결이 형성되어야 함
- 1 : 1 통신만 가능함
- 고정된 통신 선로가 최단선이 아닐경우 상대적으로 UDP보다 데이터 전송속도가 느림
[ TCP 헤더정보 ]
필드 | 크기 | 내용 |
송수신자의 포트 번호 | 16 | TCP로 연결되는 가상 회선 양단의 송수신 프로세스에 할당되는 포트 주소 |
시퀀스 번호 (Sequence Number) |
32 | 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가 SYN = 1 : 초기 시퀀스 번호가 된다. ACK 번호는 이 값에 1을 더한값 SYN = 0 : 현재 세션의 이 세그먼트 데이터의 최초 바이트 값의 누적 시퀀스 번호 |
응답 번호 (ACK Number) |
32 | 수신 프로세스가 제대로 수신한 바이트 수를 응답하기 위해 사용 |
데이터 오프셋 (Data Offset) |
4 | TCP 세그먼트의 시작 위치를 기준으로 데이터의 시작 위치를 표현(TCP 헤더의 크기) |
예약 필드(Reserved) | 6 | 사용을 하지 않지만 나중을 위한 예약 필드이며 0으로 채워져야함 |
제어 비트(Flag Bit) | 6 | SYN, ACK, FIN 등의 제어 번호 |
윈도우 크기(Window) | 16 | 수신 윈도우의 버퍼 크기를 지정할 때 사용, 0이면 송신 프로세스의 전송 중지 |
체크섬(Checksum) | 16 | TCP 세그먼트에 포함되는 프로토콜 헤더와 데이터에 대한 오류 검출 용도 |
긴급 위치(Urgent Pointer) | 16 | 긴급 데이터를 처리하기 위함, URG 플래그 비트가 지정된 경우에만 유효 |
[ TCP 제어비트정보 ]
종류 | 내용 |
ACK | 응답 번호 필드가 유효한지 설정할때 사용하며 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷 클라이언트가 보낸 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어야 함 |
SYN | 연결 설정 요구. 동기화 시퀀스 번호 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어 있어야 함 TCP 에서 세션을 성립할 때 가장먼저 보내는 패킷, 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데에 사용되며 초기에 시퀀스 번호를 보내게 됨 |
PSH | 수신 애플리케이션에 버퍼링된 데이터를 상위 계층에 즉시 전달할 때 사용 |
RST | 연결의 리셋이나 유효하지 않은 세그먼트에 대한 응답용으로 사용 |
URG | 긴급 위치를 필드가 유효한지 설정 |
FIN | 세션 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없을 때 연결 종료 의사 표시 |
[ UDP ]
- User Datagram Protocol의 약자
- 전송계층의 비연결 지향적 프로토콜
- 비연결 지향적이란 데이터를 주고받을 때 연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식을 의미
- 연결 과정이 없기 때문에 TCP보다는 빠른 전송을 할 수 있지만 데이터 전달의 신뢰성은 떨어짐
- UDP는 발신자가 데이터 패킷을 순차적으로 보내더라도 이 패킷들은 서로 다른 통신 선로를 통해 전달 될 수 있음
- 먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 도착할 수 있음
- 최악의 경우 잘못된 선로로 전송되어 유실될 수도 있음
[ UDP 특징 ]
- 비연결형 서비스로 연결 없이 통신이 가능하며 데이터그램 방식을 제공
- 데이터 경계를 구분
- 정보를 주고 받을때 정보를 보내거나 받는다는 신호절차를 거치지 않음
- 신뢰성 없는 데이터를 전송
- 패킷관리가 필요
- 패킷 오버헤드가 적어 네트워크 부하가 감소되는 장점
- 상대적으로 TCP보다 전송속도가 빠름
[ UDP의 헤더정보 ]
필드 | 크기 | 내용 |
송신자의 포트 번호 | 16 | 데이터를 보내는 어플리케이션의 포트 번호 |
수신자의 포트 번호 | 16 | 데이터를 받을 어플리케이션의 포트 번호 |
데이터의 길이 | 16 | UDP 헤더와 데이터의 총 길이 |
체크섬 | 16 | 데이터 오류 검사에 사용 |
[ UDP 단점 ]
- 데이터의 신뢰성이 없다.
- 의미있는 서버를 구축하기위해서는 일일이 패킷을 관리해주어야 한다.