hisDev/TCP/IP socket
- 책의 소스 잘못된 부분 2010.03.31
- Day #9 2010.02.23
- day #8 2010.02.23
- Nagle 알고리즘 2010.02.22
- day #7 2010.02.17
- day #6 2010.02.16
- day #5 2010.02.11
- day #4 2010.02.08
- day #3 2010.01.27
- Day #2 2010.01.26
책의 소스 잘못된 부분
Day #9
Wait() 호출 시점에 child process가 없다면, 생성시까지 blocking -> waitpid() 사용 blocking 해결
Signal : system에 특정 상황 발생 -> OS 전달 메시지 => process(signal handler 서유)에 전달
Signal handler : signal 처리 함수 모듈
Sigaction() : signal 발생 -> signal handler 함수 연결
day #8
Time-Wait :
(ACK의 소멸로 인한) 연결종료 과정에서 Four-Way-Handshaking이 제대로 안되면 Time-Wait 상태가 된다.
ACK를 재전송
Time-Wait 상태일 때 socket은 완전히 소멸되지 않는다. -> bind() error가 생긴다.
SO_REUSEADDR (1 -> True : 새 socket에 ip/port 할당 / 0 -> False : Default)
Nagle's Algorithm :
전송 가능할 때 많이 보낸다.
OFF로 설정 -> 속도가 빠름, 과부하 발생
Nagle 알고리즘
http://en.wikipedia.org/wiki/Nagle's_algorithm
전송 가능할 대 많이 보낸다.
OFF -> 속도가 빠름, 과부하 발생
day #7
socket의 종료 :
close() -> 수신/전송 모두 종료
Full Duplex에서 문제 발생 -> Half Close 방법 사용
socket -> host간 연결 -> I/O stream 생성
shutdown() :
half close를 사용하는 이유 : File 전송시 Out Stream 종료 -> EOF 자동 전송
day #6
TCP / UDP :
ip를 사용하지만 Flow Control 제공 유/무 차이가 있다
UDP 특징 :
TCP에 비해 속도가 빠름
Flow Control 제공하지 않기 때문
TCP : packet 단위
UDP : datagram 단위
UDP는 Host의 내부에서 port 정보 -> 최종 목적지를 구분
TCP를 사용해야 하는 경우 :
packet 손실이 전체 Data영향을 미치는 경우 ex)압축파일 전송
UDP를 사용해야 하는 경우 :
Muntimedia Data 실시간 전송 (빠른 속도)
TCP가 느린 이유 :
CE, CT, FC
Data 클 경우 TCP가 UDP보다 유리 (session 유지 긴 경우)
UDP :
server - listen(), accept() / client - connect() 필요없음
socket(), bind() 있어야 함
socket 하나
Data 전송 함수 호출시 + 수신 주소 정보 포함 시킴
최초의 sendto() -> ip/port를 할당(종료시까지 유지됨)
connect() 사용 할 수도 있다. -> 속도개선 (kernel -> socket 연결 / 가장 시간 많이 걸리는 작업을 미리 함)
day #5
socket :
전이중(Full - Duplex)
three - way - handshaking >> connect() 로 시작
call establish (3way) -> data transfer -> call terminate (4way)
TCP기반 -> Data 경계 모름 -> Pakcet 구성수 모름
Kernel I/O Buffer
day #4
TCP :
Transmission Control Protocol (전송과정 컨트롤)
IP :
비연결 지향.
다른 경로 선택 - 경로에 오류 비해 감
TCP는 신뢰성 있는 Protocol
IP 사용하는 이유 -> 길 찾기, 하나의 Packet 전송 가정 -> 순서, 전송 신뢰 불가
IP 기반 Host - Host 의 Data 전송 약속 -> TCP/UDP
TCP 확인 절차 -> IP에 신뢰성 부여
[Server 함수 호출 순서]
socket() -> bind() -> listen() -> accept() -> read/write() -> close()
소켓생성 -> 주소/port할당 -> 연결요청대기 -> 연결수락 -> 읽기/쓰기 -> 소켓닫기
[Client 함수 호출 순서]
socket() -> connect() -> read()/write() -> close()
소켓생성 -> 연결 -> 읽기/쓰기 -> 소켓닫기
day #3
32bit
1Byte . 1Byte. 1Byte. 1Byte
A class : 0
B Calss: 10
C Calss: 110
D Class: 1110
Packet :
Network를 이동하는 Data Block
0~1023은 예약
TCP/UDP 따로 구분됨
Process:
Main Memory 상에 실행중인 Program
sockaddr_in.sinfamily = AF.NET
AF(Address Protocol Family)를 사용할 것
Network Byte Sequence :
Motorola 68000 -> Big-Endian 사용
Intel X86 -> Little-Endian 사용
따라서, Data 전송시 통일 시킴 -> Big-Endian 만을 사용
Endian-Conversion :
htons : host byte -> network byte - short
ntohs : network byte -> host byte - short
htonl : host byte -> network byte - long
ntohl : network byte -> host byte - long
Day #2
Windock Version Check -> Library Init
MAKEWORD(2,2) -> 0X0202
socket : socket 생성, Descriptor 반환
bind : Addr, Port
listen : 연결 대기
accept : 연결 수락
connect : 연결요청
int socket(PF, TYPE, PROTOCOL) :
int : Descriptor
PF : socket 통신 환경
TYPE : SOCK_STREAM (연결지향) / SOCK_DGRAM (비연결지향)
PROTOCOL : IPPROTO_TCP (연결지향) / IPPROTO_UDP (비연결지향) => 0
TCP SOCKET -> socket(PF_INET, SOCK_STREAM, 0)
UDP SOCKET -> socket(PF_INET, SOCK_DGRAM, 0)
WSACleanup() :
terminate use of winsock